在SELECT语句中执行存储过程

时间:2009-04-03 20:19:44

标签: sql sql-server-2005 stored-procedures select

对于一个实例我是一个select语句,它返回1000行。我需要为select语句返回的每一行执行一个特定的存储过程。

你知道我该怎么办?

5 个答案:

答案 0 :(得分:12)

在您的选择中构造EXECUTE语句,如下所示:

SELECT 'EXEC sp_whatever ' + parameter stuff
FROM   your_table

然后运行结果!或者,将结果粘贴到电子表格包中,并使用字符串连接来构造EXEC语句 - 只需创建一个公式并将其粘贴到1,000行。我个人更喜欢第一种方法。

为了阐明“参数内容”,请以存储过程为例,该过程需要从int列中获取两个your_table参数。然后你会有这样的事情:

SELECT 'EXEC sp_whatever ' + CAST(field1 AS varchar) + ', ' + CAST(field2 AS varchar)
FROM    your_table

这里不需要小心字符串字段 - 您可能会无意中将自己暴露给自己的SQL注入攻击,就像任何SQL字符串连接一样。

我正在阅读你的“实例”,因为“这是一次性的任务”。如果这是一项需要自动化的任务,那么其他答案之一可能是正确的方法。

答案 1 :(得分:2)

免责声明:我不确定我是否理解您的问题。

假设您在SQL Server 2005上,您可以创建一个表值用户定义函数,并在查询中使用OUTER APPLY operator

答案 2 :(得分:2)

你可以这样做:

declare @execstatementsbatch nvarchar(max)

select @execstatementsbatch = ''

SELECT @execstatementsbatch = @execstatementsbatch   + 'EXEC UpdateQty ' + ItemCode +  ', '  + QtyBO +  '; ' 
FROM ITEMSPO 
INNER JOIN ..... 
<some conditions>

exec(@execstatementsbatch)

答案 3 :(得分:1)

大多数RDBMS都允许您从存储过程结果集中选择行。只需将存储过程放在FROM子句中,就像使用公用表表达式一样。例如:

SELECT sp.ColumnInResultSet, t.BaseTableColumnName
FROM sp_whatever ( Args) sp INNER JOIN BaseTable t ON t.ID = sp.ID;

答案 4 :(得分:0)

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