2014-01-15 41 views
1

我想提出一個分割功能爲選擇像如何把分割功能爲查詢選擇SQL

CREATE TABLE #tmp(id INT ,codes VARCHAR(10)) 


INSERT INTO #tmp(id,codes) VALUES (1,'1;2;3') 


SELECT id , BaseSplit(codes,';') FROM #tmp 

但如何???

+0

什麼是您的分裂函數返回???一張桌子 ??? –

+0

這將有助於查看預期結果,而不是猜測BaseSplit執行的操作。 – booyaa

回答

2

您需要使用CROSS APPLY是這樣的....

SELECT * FROM #tmp 
CROSS APPLY dbo.BaseSplit(#tmp.codes, ';') AS htvf 
1

我不相信你提出的查詢將工作,因爲你試圖返回設置爲選擇的部分記錄。這會拋出一個子查詢返回多個值。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。如果您想將該值作爲表格拆分,可以使用UDF。

下面是最初發布由戴維·塔克here早在2005年

CREATE FUNCTION dbo.Split(@String NVARCHAR(MAX), @Delimiter NVARCHAR(MAX)) 
RETURNS @Results TABLE (Items NVARCHAR(MAX)) 
AS 
BEGIN 
    DECLARE @index INT 
    DECLARE @slice NVARCHAR(MAX) 

    SELECT @index = 1 
    IF @String IS NULL RETURN 

    WHILE @index != 0 

    BEGIN 
     SELECT @index = CHARINDEX(@Delimiter,@String) 
     IF @index !=0 
     SELECT @slice = LEFT(@String,@index - LEN(@Delimiter)) 
     ELSE 
     SELECT @slice = @String 

     INSERT INTO @Results(Items) VALUES(@slice) 
     SELECT @String = RIGHT(@String,LEN(@String) - @index) 
     IF LEN(@String) = 0 BREAK 
    END RETURN 
END

使用量稍微修改UDF:

SELECT * FROM dbo.Split('1;2;3', ';')