1

我尝试了很多次将查询作为参数传递给执行 a stored procedure。但它每次都会给出编译时错误。下面是我的query

exec IAM_INSERT_ASSET (select top 1 ItemID from MIR_ItemMaster order by ItemID desc),1662

有两个参数,其中第一个是查询动态的,第二个是硬编码的。Obviously I can do this by keeping query in variable and passing variable.但我不想声明变量并将查询直接传递给过程。这怎么可能实现。有什么帮助吗?

4

5 回答 5

1

您可以在语句中提供的所有1都是文字或变量。这是记录在案的语法:EXECEXEC

[ { EXEC | EXECUTE } ]
    { 
      [ @return_status = ]
      { module_name [ ;number ] | @module_name_var } 
        [ [ @parameter = ] { value 
                           | @variable [ OUTPUT ] 
                           | [ DEFAULT ] 
                           }
        ]
      [ ,...n ]
      [ WITH <execute_option> [ ,...n ] ]
    }
[;]

而已。所以你必须走可变路线。


1您还可以使用一些内置函数,例如@@IDENTITY,它曾经是一个“全局变量”,但这在很大程度上是例外而不是规则。

于 2013-07-04T09:51:24.243 回答
1

@eraj
我得到了你的基本查询。
但是,我认为它不能完全按照您想要的方式完成,即将查询作为参数传递。这可以通过我感觉的两种方式来完成。

1) 用这个 SELECT 写一个游标并从游标内执行 SP。

DECLARE @p1 varchar(800);
DECLARE @p2 varchar(800);
DECLARE @p3 varchar(800);

DECLARE SP_Cursor CURSOR
    FOR SELECT p1,p2,p3
        FROM ..

OPEN SP_Cursor;

FETCH NEXT FROM SP_Cursor INTO @p1, @p2, @p3;

WHILE (@@FETCH_STATUS <> -1)  
BEGIN  
    EXEC SP_Name @p1,@p2,@p3;  
    FETCH NEXT FROM SP_Cursor INTO @p1, @p2, @p3;  
END  

CLOSE SP_Cursor;

DEALLOCATE SP_Cursor;

正如我所说,这会很慢,因为如果您的查询返回 1000 行,SP 每次都会执行 1000 次连接到数据库。
您可以通过将数据集放入 #temp_table 并通过 WHILE 循环循环来提高性能。至少每次连接到数据库时都会中断。

2) 第二种选择是通过 SELECT 查询构建执行语句本身。

declare @execstatementsbatch nvarchar(max)
select @execstatementsbatch = ''

SELECT @execstatementsbatch = @execstatementsbatch   + 'EXEC SP_Name' + p1 +  ', '  + p2 +  ', '  + p3 + '; ' 
FROM..
<some conditions>

exec(@execstatementsbatch)

但请注意,如果您处理大量数据,两者的性能都不是很好。


于 2013-07-05T06:31:27.387 回答
0

为什么不将第一个参数定义为 varchar 并将查询作为字符串传递?它基本上看起来像,

exec IAM_INSERT_ASSET 'select top 1 ItemID from MIR_ItemMaster order by ItemID desc',1662
于 2013-07-04T09:31:35.057 回答
0

首先,我现在无法访问 SQL Server,所以这可能行不通。

其次,我不明白你为什么不想使用变量——这是迄今为止最简单的解决方案。如果您构建的存储过程过于聪明 - 例如,根据第一个参数的值,IAM_INSERT_ASSET 的行为会有所不同,我建议您重新考虑这一点。从架构的角度来看,存储过程难以测试、调试和理解,因此您经常会通过明显不相关的更改(例如向表中添加列)来破坏存储过程。

最后,如果你真的想这样做,你可以使用动态 SQL。如果将第一个参数更改为 varchar,然后用于sp_executeSQL执行该 varchar 的内容,则可以传入任何你想要的。警告 - 我不知道这是否有效,不能尝试。其他警告 - 这可能会使您的系统变得脆弱并以令人兴奋的方式失败。

于 2013-07-04T09:43:53.860 回答
0

也许这会起作用?

declare @docnumber2 char(21) -- or whatever the field is varchar,int,etc.
set @docnumber2 = (select top 1 docnumber from invoices order by doc_timestamp)
exec udsp_blahblah @docnumber2
于 2015-02-07T18:11:12.500 回答