簡體   English   中英

SQL存儲過程僅返回函數創建的表的第一行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM