在 sql 中执行 sp 的问题
Problems with the execution of a sp in sql
我一直在尝试执行下一个 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
如果我执行联合查询,我将得到下一个输出(显然 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。
谢谢
你的主要问题是 @ID NVARCHAR
等同于 @ID NVARCHAR(1)
并且你被截断了。
此处也不需要光标,应避免使用 sp_
前缀,因为它是为 Microsoft 系统过程保留的。
以下将return输出
,OR ID ='101075330-IC001',OR ID ='ACP-2582785',OR ID ='ACP-645655',OR
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
我一直在尝试执行下一个 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
如果我执行联合查询,我将得到下一个输出(显然 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。
谢谢
你的主要问题是 @ID NVARCHAR
等同于 @ID NVARCHAR(1)
并且你被截断了。
此处也不需要光标,应避免使用 sp_
前缀,因为它是为 Microsoft 系统过程保留的。
以下将return输出
,OR ID ='101075330-IC001',OR ID ='ACP-2582785',OR ID ='ACP-645655',OR 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