Sql-Server

將查詢用作函式參數時出錯

  • January 25, 2018

我已按照本教程創建字元串拆分函式。

當我嘗試使用 aSELECT作為第一個參數執行文章中的函式時,出現以下錯誤:

select 'Name' 
from   [dbo].[fnSplitString]((SELECT tbl.Field  
                             FROM   [dbo].Mytable  as tbl),',')

子查詢返回超過 1 個值。當子查詢跟隨 =、!=、<、<=、>、>= 或子查詢用作表達式時,這是不允許的。

您不能將查詢傳遞給這樣的函式。如何使用CROSS APPLY

SELECT tbl.&lt;KeyColumn&gt;, f.Name 
 FROM dbo.MyTable AS tbl
 CROSS APPLY dbo.fnSplitString(tbl.Field, ',') AS f;

當然,在 SQL Server 2016 中,現在有了對這一點的原生支持,使用新STRING_SPLIT函式,而不必編寫自己的(效率較低的)函式:

SELECT tbl.&lt;KeyColumn&gt;, 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),',')

引用自:https://dba.stackexchange.com/questions/196165