簡體   English   中英

在SQL2005中使用一條命令將多行插入到臨時表中

[英]Insert multiple rows into temp table with one command in 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查詢字符串中。 我顯然可以根據需要先對其進行修改。

嘗試類似

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

您可以像這樣動態創建查詢:

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

與往常一樣,在動態創建查詢時,必須小心,以便僅使用受信任的數據。

我將創建一個將返回表變量的函數,然后將該函數加入到select中

采用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM