[英]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.