[英]SQL stored procedure only return first row of table created by function
我有一個函數,它將帶分隔符的VARCHAR轉換為INT表。
IntSplit:
USE [master]
GO
/****** Object: UserDefinedFunction [dbo].[IntSplit] Script Date: 02/10/2016 15:17:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[IntSplit]
(
@String NVARCHAR(4000),
@Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
WITH Split(stpos,endpos)
AS(
SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
UNION ALL
SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
FROM Split
WHERE endpos > 0
)
SELECT 'Data' = CONVERT(INT, SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos))
FROM Split
)
GO
當我在查詢中運行此命令時:
SELECT * FROM IntSplit('1,2,3', ',')
我得到以下預期結果:
|Data
-+----
1| 1
2| 2
3| 3
我也有一個存儲過程,它執行完全相同的操作(即調用該函數)
my_int_split:
USE [master]
GO
/****** Object: StoredProcedure [dbo].[my_int_split] Script Date: 02/10/2016 15:29:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[my_int_split]
(@i_ids VARCHAR)
AS
-- Common set conditions
-- Explicity suppress count information
SET NOCOUNT ON
-- Unhandled exception aborts whole transaction
SET XACT_ABORT ON
-- Autocommit on
SET IMPLICIT_TRANSACTIONS OFF
-- UK datetime
SET DATEFORMAT dmy
--
SET NOCOUNT ON
--
BEGIN
SELECT * FROM IntSplit(@i_ids, ',')
END
GO
但是,如果我使用以下命令運行存儲過程
my_int_split '1,2,3'
然后我只將第一行返回
|Data
-+----
1| 1
據我所知,存儲過程正在做與查詢完全相同的事情,但只會返回第一行。 請注意,如果我將VARCHAR設置為'2,3,4',它將返回值2的一行,因此,它不僅總是向后吐出1。
有什么想法嗎?
永遠不要使用沒有長度的VARCHAR
,因為您的@i_ids
參數被截斷為1個字符。
如果您知道ID列表可能會持續多長時間,請以此為指導來指定最大長度(加上一些松弛); 否則,使用VARCHAR(MAX)
,效率較低,但大小幾乎是任意的。
另外,請避免混合使用NVARCHAR
(在函數中)和VARCHAR
(在SP中),否則會由於轉換而導致性能下降。 同樣(雖然不適用於此特定情況),但由於數據類型不同,它可能導致索引被跳過。
“有趣”的事情是沒有給出長度時所假定的長度不一致。 有關更多詳細信息,請參見Aaron Bertrand的博客文章 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.