2010-04-20 96 views
2
一个命令

我有一些数据的格式如下:插入多行到临时表与SQL2005

-1,-1,-1,-1,701,-1,-1,-1,-1,-1,304,390,403,435,438,439,442,455 

我需要将其插入到一个临时表是这样的:

CREATE TABLE #TEMP 
(
Node int 
) 

这样我就可以将它与另一个表中的数据进行比较。

上面的数据表示“节点”列的单独行。

有没有一种简单的方法来插入这些数据,所有在一个命令?

此外,数据实际上会以字符串的形式进入,所以我需要能够将它连接到SQL查询字符串中。如果需要,我可以明显修改它。

+1

Google“sql server split function” – 2010-04-20 15:45:55

回答

3

功能尝试类似

CREATE TABLE #TEMP 
( 
    Node int 
) 


DECLARE @textXML XML 
DECLARE @data NVARCHAR(MAX), 
     @delimiter NVARCHAR(5) 
SELECT @data = '-1,-1,-1,-1,701,-1,-1,-1,-1,-1,304,390,403,435,438,439,442,455 ', 
     @delimiter = ',' 
SELECT @textXML = CAST('<d>' + REPLACE(@data, @delimiter, '</d><d>') + '</d>' AS XML) 

INSERT INTO #TEMP 
SELECT T.split.value('.', 'nvarchar(max)') AS data 
FROM @textXML.nodes('/d') T(split) 

SELECT * FROM #TEMP 

DROP TABLE #TEMP 
1

我想创建一个能够返回表变量,然后加入该功能进入选择

使用功能:

select * from myTable a 
inner join dbo.buildTableFromCSV('1,2,3') on a.id = b.theData 

这里是我做这个

CREATE FUNCTION [dbo].[buildTableFromCSV] (@csvString varchar(8000)) RETURNS @myTable TABLE (ID int identity (1,1), theData varchar(100)) 
AS BEGIN 
    DECLARE @startPos  Int   -- position to chop next block of chars from 
    DECLARE @currentPos  Int   -- position to current character we're examining 
    DECLARE @strLen  Int 

    DECLARE @c   char(1)   -- current subString 

    -- variable initalization 
    -- ------------------------------------------------------------------------------------------------------------------------------------------------- 
     SELECT @csvString = @csvString + ',' 
     SELECT @startPos  = 1 
     SELECT @currentPos = 1 



     SELECT @strLen  = Len(@csvString) 




    -- loop over string and build temp table 
    -- ------------------------------------------------------------------------------------------------------------------------------------------------- 

     WHILE @currentPos <= @strLen BEGIN 
      SET @c = SUBSTRING(@csvString, @currentPos, 1)   




      IF (@c = ',' ) BEGIN 


       IF (@currentPos - @startPos > 0) BEGIN 

        INSERT 
        INTO  @myTable (theData) 
        VALUES   ( CAST(SUBSTRING (@csvString, @startPos, @currentPos - @startPos) AS varchar)) 

       END 
       ELSE 
       begin 
        INSERT 
        INTO  @myTable (theData) 
        VALUES   ( null) 

       end 
       SELECT @startPos = @currentPos + 1 

      END 

      SET @currentPos = @currentPos + 1 
     END 

     delete from @myTable where theData is null 

    return 
END 
2

您可以动态创建一个这样的查询:

declare @sql varchar(1000) 
set @sql = 'insert into #TEMP select ' + replace(@values, ',', ' union all select ') 
exec @sql 

一如既往动态创建查询时,你必须要小心,所以你只使用受信任的数据。