您需要一種方法來分割和處理TSQL中的字符串,有很多方法可以做到這一點。本文介紹了幾乎每一個方法的優點和缺點:
Arrays and Lists in SQL Server 2000 and Earlier
你需要創建一個分裂的功能。這是一個分裂的功能如何使用:
SELECT
*
FROM YourTable y
INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value
[我更喜歡數字表方法將拆分TSQL字符串(Arrays and Lists in SQL Server 2000 and Earlier),但也有許多方法來拆分在SQL Server中的字符串,見前面的鏈接,這解釋了每個項目的PRO和CON。
對於數字表的方法來工作,你需要做的這一次表的設置,這將創建一個包含從1到10000行的表Numbers
:
SELECT TOP 10000 IDENTITY(int,1,1) AS Number
INTO Numbers
FROM sys.objects s1
CROSS JOIN sys.objects s2
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)
一旦Numbers表格設置,創建此分割功能:
CREATE FUNCTION inline_split_me (@SplitOn char(1),@param varchar(7998)) RETURNS TABLE AS
RETURN(SELECT substring(@SplitOn + @param + ',', Number + 1,
charindex(@SplitOn, @SplitOn + @param + @SplitOn, Number + 1) - Number - 1)
AS Value
FROM Numbers
WHERE Number <= len(@SplitOn + @param + @SplitOn) - 1
AND substring(@SplitOn + @param + @SplitOn, Number, 1) = @SplitOn)
GO
您現在可以輕鬆地拆分CSV字符串轉換成表格,並加入就可以了:
select * from dbo.inline_split_me(';','1;22;333;4444;;') where LEN(Value)>0
OUTPUT:
Value
----------------------
1
22
333
4444
(4 row(s) affected)
讓你新表使用此:
--set up tables:
create table TableA (id int, commodities varchar(8000))
INSERT TableA VALUES (1135,'fish,eggs,meat')
INSERT TableA VALUES (1127,'flour,oil')
Create table TableB (id int, commodities varchar(8000))
--populate TableB
INSERT TableB
(id, commodities)
SELECT
a.id,c.value
FROM TableA a
CROSS APPLY dbo.inline_split_me(',',a.commodities) c
--show tableB contents:
select * from TableB
OUTPUT:
id commodities
----------- -------------
1135 fish
1135 eggs
1135 meat
1127 flour
1127 oil
(5 row(s) affected)
編輯後有關SQL Server 2000不支持CROSS APPLY
康拉德Frix評論
這也將這樣做:
INSERT TableB
(id, commodities)
SELECT
a.id,NullIf(SubString(',' + a.commodities + ',' , number , CharIndex(',' , ',' + a.commodities + ',' , number) - number) , '')
FROM TableA a
INNER JOIN Numbers n ON 1=1
WHERE SubString(',' + a.commodities + ',' , number - 1, 1) = ','
AND CharIndex(',' , ',' + a.commodities + ',' , number) - number > 0
AND number <= Len(',' + a.commodities + ',')
,並基於從the link in the answer by @Rup代碼。它基本上刪除了函數調用,並在主查詢中進行拆分(使用類似的Numbers表拆分),因此不需要CROSS APPLY
。
你是什麼意思通常refered爲normaliztion(1.正常形態要準確)。也許你想把它添加到你的標題。 – 2010-07-09 17:16:43
數據庫?版? – 2010-07-09 17:16:48
SQl Server 2000 – dmr 2010-07-09 17:18:19