Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server sql server中带游标的函数_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server sql server中带游标的函数

Sql server sql server中带游标的函数,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我编写了一个带有游标的SQL标量函数,用逗号分隔的值检索项目名称。这是我的函数,但它给了我一个错误 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER FUNCTION [dbo].[GET_ITEM_NAME] ( @PRINT_RECEIPT_MST_ID INT ) RETURNS VARCHAR(1000) AS BEGIN DECLARE @ITEM_TITLE VAR

我编写了一个带有游标的SQL标量函数,用逗号分隔的值检索项目名称。这是我的函数,但它给了我一个错误

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO

ALTER FUNCTION [dbo].[GET_ITEM_NAME]
    (
      @PRINT_RECEIPT_MST_ID INT
    )
RETURNS VARCHAR(1000)
AS
    BEGIN
        DECLARE @ITEM_TITLE VARCHAR(1000)
        DECLARE @ITEM VARCHAR(100)
        SET @ITEM_TITLE = '';
        DECLARE ItemTitleCursor CURSOR FAST_FORWARD
        FOR
            SELECT ISNULL(IMT.ITEM_TITLE,'')
            FROM PRINT_RECEIPT_DET_T PDT 
            LEFT OUTER JOIN ITEM_MST_T IMT ON IMT.ITEM_ID=PDT.ITEM_ID
            WHERE PDT.PRINT_RECEIPT_MST_ID = @PRINT_RECEIPT_MST_ID

        OPEN ItemTitleCursor

        FETCH NEXT FROM ItemTitleCursor INTO @ITEM

        WHILE @@FETCH_STATUS = 0
            BEGIN
                IF ( @ITEM_TITLE = '' )
                    BEGIN
                        SET @ITEM_TITLE = CAST(@ITEM AS VARCHAR(100));
                    END
                ELSE
                    BEGIN
                        SET @ITEM_TITLE = CAST(@ITEM_TITLE AS VARCHAR(1000))
                            + ' , ' + CAST(@ITEM AS VARCHAR(100));
                    END
                FETCH NEXT FROM ItemTitleCursor INTO @ITEM
            END


        CLOSE ItemTitleCursor
        DEALLOCATE ItemTitleCursor 

        RETURN @ITEM_TITLE

    END

如果我没有错,这应该替换您的
光标

DECLARE @ITEM_TITLE           VARCHAR(1000)='',
        @PRINT_RECEIPT_MST_ID INT

SELECT @ITEM_TITLE = + Isnull(IMT.ITEM_TITLE, '') + ','
FROM   PRINT_RECEIPT_DET_T PDT
       LEFT OUTER JOIN ITEM_MST_T IMT
                    ON IMT.ITEM_ID = PDT.ITEM_ID
WHERE  PDT.PRINT_RECEIPT_MST_ID = @PRINT_RECEIPT_MST_ID

SELECT @Left(@ITEM_TITLE, Len(@ITEM_TITLE) - 1) 
或者使用
For xml path
将所有行转换为
csv

DECLARE @ITEM_TITLE           VARCHAR(1000)='',
        @PRINT_RECEIPT_MST_ID INT

SET @ITEM_TITLE=(SELECT Isnull(IMT.ITEM_TITLE, '') + ','
                 FROM   PRINT_RECEIPT_DET_T PDT
                        LEFT OUTER JOIN ITEM_MST_T IMT
                                     ON IMT.ITEM_ID = PDT.ITEM_ID
                 WHERE  PDT.PRINT_RECEIPT_MST_ID = @PRINT_RECEIPT_MST_ID
                 FOR XML PATH(''))

SELECT Left(@ITEM_TITLE, Len(@ITEM_TITLE) - 1) 

谢谢大家的快速回复! 我已经解决了它。我的光标返回的长度比我提到的要长。它应该是

RETURNS VARCHAR(4000)  

但它给了我错误也许你能告诉我们你得到了什么错误?请包含完整的代码,使用
create函数…
partFirst,在SQL中很少需要游标,因为十年中只需要一次,特别是对于简单的查询。第二,真正的问题是如何聚合字符串-与其他类似问题的重复。此方法可能重复以聚合未定义的字符串behavior@PanagiotisKanavos-更新您解决了错误的问题。真正的问题是如何聚合字符串-答案不是游标。最快的方法是XML路径技术。请您详细解释一下,或者给我举个例子。实际上,我正在使用存储过程绑定jquery表。我只能将datatable绑定到jquery表,所以不能在分部类中编写额外的属性。这就是我决定用游标编写函数的原因。