gpt4 book ai didi

sql - 使用字符串变量对表的每一行执行存储过程

转载 作者:行者123 更新时间:2023-12-02 02:53:54 27 4
gpt4 key购买 nike

我想在不使用游标或循环的情况下对表的每一行执行一个存储过程。假设我的表 dbo.User 包含以下用户的名称:

create table dbo.test_User  ( 
Name varchar(50) )

insert into dbo.test_User
values ('Deepanshu'),('IronMan'),('DoctorStrange')

我创建了一个只显示用户名的存储过程(虽然我真正的存储过程必须做很多事情)

create procedure dbo.usp_TestSP ( @name varchar(50) )
as
BEGIN
select @name
END

现在我希望存储过程针对所有名称运行,例如:

EXEC dbo.usp_TestSP 'Deepanshu';
EXEC dbo.usp_TestSP 'IronMan';
EXEC dbo.usp_TestSP 'DoctorStrange';

我创建了一个字符串变量@Query,它将存储我要执行的t-sql查询

DECLARE @Query varchar(200);  
select @Query=STUFF(
(select 'dbo.usp_TestSP '''+Name+''';'
from dbo.test_user
FOR XML PATH('')
),1,0,''
)
EXEC @Query

当我尝试执行这个@Query时,它给我一个错误提示:

Could not find server 'dbo' in sys.servers. Verify that the correct server name was specified. If necessary, execute the stored procedure sp_addlinkedserver to add the server to sys.servers.

如何使用字符串变量@Query 为所有名称执行存储过程?

最佳答案

您可以使用 CURSOR 来模拟带有存储过程调用的 FOR-EACH:

DECLARE db_cursor CURSOR LOCAL FAST_FORWARD FOR 
SELECT *FROM dbo.tesT_User;

DECLARE @name NVARCHAR(50);

OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @name;

WHILE @@FETCH_STATUS = 0
BEGIN
EXEC dbo.usp_TestSP @name = @name;

FETCH NEXT FROM db_cursor INTO @name;
END

CLOSE db_cursor;
DEALLOCATE db_cursor;

DBFiddle Demo


警告:

如果它是简单的函数,那么 CROSS/OUTER APPLY 是一种可行的方法。

SELECT *
FROM dbo.Test_User tu
OUTER APPLY (SELECT dbo.usp_TestSP(tu.name)) s(a);

DBFiddle Demo2


编辑

i want to execute this without cursor or loop, using the same logic as displayed above

DECLARE @x NVARCHAR(MAX) = 
(SELECT string_agg(FORMATMESSAGE('EXEC dbo.usp_TestSP @name=''%s'';', name)
,CHAR(13)) AS r FROM dbo.test_User);
PRINT @x;
EXEC(@x);

DBFiddle Demo3


最后是你的代码:

DECLARE @Query varchar(MAX);  
select @Query=STUFF((SELECT 'EXEC dbo.usp_TestSP @name=' +QUOTENAME(Name,'''')
+ ';' from dbo.test_user
FOR XML PATH('')),1,0,'');
EXEC(@Query);

DBFiddle Demo4

我做了什么:

  • 使用分号 (;) 这是很好的做法
  • 将数据类型更改为 VARCHAR(MAX)
  • 在 SQL 中添加了 EXEC
  • () 包装了 @Query

关于sql - 使用字符串变量对表的每一行执行存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50526180/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com