Sql-Server
將查詢用作函式參數時出錯
我已按照本教程創建字元串拆分函式。
當我嘗試使用 a
SELECT
作為第一個參數執行文章中的函式時,出現以下錯誤:select 'Name' from [dbo].[fnSplitString]((SELECT tbl.Field FROM [dbo].Mytable as tbl),',')
子查詢返回超過 1 個值。當子查詢跟隨 =、!=、<、<=、>、>= 或子查詢用作表達式時,這是不允許的。
您不能將查詢傳遞給這樣的函式。如何使用
CROSS APPLY
:SELECT tbl.<KeyColumn>, f.Name FROM dbo.MyTable AS tbl CROSS APPLY dbo.fnSplitString(tbl.Field, ',') AS f;
當然,在 SQL Server 2016 中,現在有了對這一點的原生支持,使用新
STRING_SPLIT
函式,而不必編寫自己的(效率較低的)函式:SELECT tbl.<KeyColumn>, f.Name FROM dbo.MyTable AS tbl CROSS APPLY STRING_SPLIT(tbl.Field, ',') AS f;
因此fnSplitString函式只接受一個數據值並根據您指定的分隔符拆分為多個值。在您的情況下,您正在執行的子查詢產生超過 1 個數據值。該功能將在這種情況下中斷。為了進行測試,將前 1 添加到您的子查詢中,您將看到它有效。您的分隔符也是數據中的“逗號”嗎?
> select 'Name' from [dbo].[fnSplitString]((SELECT top 1 tbl.Field FROM [dbo].Mytable as tbl),',')
這將執行,但結果將是“名稱”,因為您的查詢將列值硬編碼為“名稱”。你可能想要這樣的東西:
select * from [dbo].[fnSplitString]((SELECT top 1 tbl.Field FROM [dbo].Mytable as tbl),',')