举一个例子,我有一个select语句,它返回了1000行数据。我需要为每一行数据执行一个特定的存储过程。
你知道该如何实现吗?
举一个例子,我有一个select语句,它返回了1000行数据。我需要为每一行数据执行一个特定的存储过程。
你知道该如何实现吗?
你可以像这样在SELECT语句中构建执行语句:
SELECT 'EXEC sp_whatever ' + parameter stuff
FROM your_table
然后运行结果!或者,将结果粘贴到电子表格软件中,并使用字符串连接构建 EXEC 语句——只需创建一个公式并向下粘贴 1000 行即可。我个人更喜欢第一种方法。
为了澄清“参数”,以需要从 your_table
列中获取两个 int
参数的存储过程为例,您可以使用如下代码:
SELECT 'EXEC sp_whatever ' + CAST(field1 AS varchar) + ', ' + CAST(field2 AS varchar)
FROM your_table
在这里不需要小心处理字符串字段-与任何SQL字符串连接一样,您会面临意外暴露自己的SQL注入攻击的风险。
我将你的“例如”解读为“这是一个一次性任务”。如果这是需要自动化的任务,则其他答案可能是正确的方法。
'EXEC sp_whatever ' + CAST(Field1 AS varchar) + ', ' + CAST(Field2 AS varchar) FROM your_table
。然后实际执行的命令将是EXEC sp_whatever 123, 456
这种形式的。 - David Mdeclare @execstatementsbatch nvarchar(max)
select @execstatementsbatch = ''
SELECT @execstatementsbatch = @execstatementsbatch + 'EXEC UpdateQty ' + ItemCode + ', ' + QtyBO + '; '
FROM ITEMSPO
INNER JOIN .....
<some conditions>
exec(@execstatementsbatch)
OUTER APPLY
操作符。大多数关系型数据库管理系统都可以从存储过程结果集中选择行。只需像使用普通表达式一样将存储过程放在FROM子句中即可。例如:
SELECT sp.ColumnInResultSet, t.BaseTableColumnName
FROM sp_whatever ( Args) sp INNER JOIN BaseTable t ON t.ID = sp.ID;
CREATE PROCEDURE dbo.usp_userwise_columns_value
(
@userid BIGINT
)
AS
BEGIN
DECLARE @maincmd NVARCHAR(max);
DECLARE @columnlist NVARCHAR(max);
DECLARE @columnname VARCHAR(150);
DECLARE @nickname VARCHAR(50);
SET @maincmd = '';
SET @columnname = '';
SET @columnlist = '';
SET @nickname = '';
DECLARE CUR_COLUMNLIST CURSOR FAST_FORWARD
FOR
SELECT columnname , nickname
FROM dbo.v_userwise_columns
WHERE userid = @userid
OPEN CUR_COLUMNLIST
IF @@ERROR <> 0
BEGIN
ROLLBACK
RETURN
END
FETCH NEXT FROM CUR_COLUMNLIST
INTO @columnname, @nickname
WHILE @@FETCH_STATUS = 0
BEGIN
SET @columnlist = @columnlist + @columnname + ','
FETCH NEXT FROM CUR_COLUMNLIST
INTO @columnname, @nickname
END
CLOSE CUR_COLUMNLIST
DEALLOCATE CUR_COLUMNLIST
IF NOT EXISTS (SELECT * FROM sys.views WHERE name = 'v_userwise_columns_value')
BEGIN
SET @maincmd = 'CREATE VIEW dbo.v_userwise_columns_value AS SELECT sjoid, CONVERT(BIGINT, ' + CONVERT(VARCHAR(10), @userid) + ') as userid , '
+ CHAR(39) + @nickname + CHAR(39) + ' as nickname, '
+ @columnlist + ' compcode FROM dbo.SJOTran '
END
ELSE
BEGIN
SET @maincmd = 'ALTER VIEW dbo.v_userwise_columns_value AS SELECT sjoid, CONVERT(BIGINT, ' + CONVERT(VARCHAR(10), @userid) + ') as userid , '
+ CHAR(39) + @nickname + CHAR(39) + ' as nickname, '
+ @columnlist + ' compcode FROM dbo.SJOTran '
END
--PRINT @maincmd
EXECUTE sp_executesql @maincmd
END
-----------------------------------------------
SELECT * FROM dbo.v_userwise_columns_value