다음과 같은 형식의 데이터가 있습니다.
-1,-1,-1,-1,701,-1,-1,-1,-1,-1,304,390,403,435,438,439,442,455
다음과 같이 임시 테이블에 삽입해야합니다.
CREATE TABLE #TEMP
(
Node int
)
그래서 다른 테이블의 데이터와 비교하여 사용할 수 있습니다.
위의 데이터는 "노드"열의 개별 행을 나타냅니다.
하나의 명령으로이 데이터를 삽입하는 쉬운 방법이 있습니까?
또한, 데이터가 실제로 들어온 문자열로 오는 것입니다 ... 그래서 난 그냥 SQL 쿼리 문자열로 concat 수 있어야합니다. 필요한 경우 먼저 수정할 수 있습니다.
다음과 같이 시도해보십시오.
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