在sql中执行sp的问题

时间:2015-05-25 21:40:16

标签: sql-server tsql stored-procedures

我一直在尝试执行下一个sp。我的目标是生成一个具有多个ID值的字符串。这就是我所做的:

ALTER PROCEDURE SP_IDENTIF @ID NVARCHAR OUTPUT
AS
BEGIN       
        DECLARE 
        @DATUM NVARCHAR(MAX),
        @CONCAT NVARCHAR(MAX), 
        @IDENTIFIC NVARCHAR(MAX),
        @T DATETIME ;
        SET @IDENTIFIC = '';

        DECLARE IDENTIFIERS CURSOR LOCAL FOR 
            SELECT TOP 2 ID
            FROM TABLE_1
            WHERE ID IS NOT NULL
            UNION 
            SELECT TOP 2 ID
            FROM TABLE_2
            WHERE ID IS NOT NULL

        OPEN IDENTIFIERS
            FETCH NEXT FROM IDENTIFIERS INTO @DATUM
                WHILE @@FETCH_STATUS = 0
                    BEGIN  
                    PRINT @IDENTIFIC;
                    SELECT @IDENTIFIC = CONCAT(@IDENTIFIC,',OR ID =''',@DATUM,'''');
                    FETCH NEXT FROM IDENTIFIERS INTO @DATOS;    
                    END;

        CLOSE IDENTIFIERS;
        SET @ID =  @IDENTIFIC;  
        PRINT('THE IDENTIFIERS ARE: '+@ID);
        RETURN;
END

如果我执行union查询,我将有下一个输出(显然top关键字只是为了测试结果):

ID
101075330-IC001
ACP-2582785
ACP-645655
ACP-942612

但是当我打电话给sp时,我会得到下一个输出:

declare @identific nvarchar(max);
exec sp_Identif @identific output;
print 'The ID set is: '+@identific;


,OR ID ='101075330-IC001'
,OR ID ='101075330-IC001',OR ID ='ACP-2582785'
,OR ID ='101075330-IC001',OR ID ='ACP-2582785',OR ID ='ACP-645655'
THE IDENTIFIERS ARE : ,
The ID set is : 

我正在打印变量@identif和@Id的结果,以检查其值的变化。正如您所看到的,只能看到在字符串变量中插入了3个Id,但是在循环结束时,输出变量中没有任何值recordint。

我对这段代码做错了什么?是否有另一种方法来达到同一目标?我正在尝试实现一个将从SSIS调用的SP。

由于

1 个答案:

答案 0 :(得分:4)

您的主要问题是@ID NVARCHAR相当于@ID NVARCHAR(1)而您正在截断。

此处也不需要游标,应避免使用sp_前缀,因为它是为Microsoft系统过程保留的。

以下内容将返回

的输出
  

,OR ID ='101075330-IC001',或ID ='ACP-2582785',或ID ='ACP-645655',或   ID ='ACP-942612'

来自您的示例输入

CREATE PROCEDURE dbo.usp_IDENTIF (@ID NVARCHAR(MAX) OUTPUT)
AS
  BEGIN
      WITH T(ID)
           AS (SELECT ID
               FROM   TABLE_1
               WHERE  ID IS NOT NULL
               UNION
               SELECT ID
               FROM   TABLE_2
               WHERE  ID IS NOT NULL)
      SELECT @ID = CAST((SELECT CONCAT(',OR ID =''', ID, '''')
                         FROM   T
                         FOR XML PATH('')) AS NVARCHAR(MAX))
  END