次の形式のデータがあります。
-1,-1,-1,-1,701,-1,-1,-1,-1,-1,304,390,403,435,438,439,442,455
このように一時テーブルに挿入する必要があります。
CREATE TABLE #TEMP
(
Node int
)
他のテーブルのデータと比較するためにそれを使うことができるように。
上記のデータは、 "Node"列の別々の行を表します。
このデータをすべて1つのコマンドで挿入する簡単な方法はありますか?
また、データは実際には文字列として表示されるように入力されるので、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