2013-07-04 93 views
0

我尝试了许多时间将查询作为参数传递给执行一个stored procedure。但它每次都会给编译时间带来错误。下面是我query通过传递参数作为查询来执行sql存储过程

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.但我不想声明变量并直接将查询传递给过程。这怎么能实现。任何帮助?

+1

什么是存储过程的数据类型?与ItemID相同?使用一个变量。运行该过程是一个语句,因此它不能有其他语句。 –

+0

数据类型与参数 –

+0

相同为什么你不使用变量?我认为这是传递动态参数的方式。 – Kitty

回答

0

首先,我没有访问SQL Server的现在,所以这可能无法正常工作。其次,我不明白你为什么不想使用变量 - 这是迄今为止最简单的解决方案。如果您构建的存储过程太聪明 - 例如根据第一个参数的值,IAM_INSERT_ASSET的行为会有所不同,我建议您重新考虑一下。存储过程很难测试,很难调试,并且从体系结构的角度来看很难理解,因此通常最终会通过一个明显不相关的更改(例如向表中添加一列)来破坏存储过程。

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

0

为什么不将第一个参数定义为varchar并将查询作为字符串传递? 它基本上会是什么样子,

exec IAM_INSERT_ASSET 'select top 1 ItemID from MIR_ItemMaster order by ItemID desc',1662 
+0

我有所有参数动态。每个程序的输入参数将是更繁琐的工作变更数据类型 –

1

所有,你可以在一个EXEC声明提供的文字或变量。以下是EXEC的文档语法:

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

就是这样。所以你必须走可变路线。


您还可以使用内置的功能的几个,像@@IDENTITY,这曾经是一个“全局变量”,但它是非常例外的,而不是规则。

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循环,可以提高性能。它至少会在每次连接到数据库时切断。

  1. 第二个选项是通过SELECT查询来构建执行语句本身。

    申报@execstatementsbatch为nvarchar(最大) 选择@execstatementsbatch = ''

    SELECT @execstatementsbatch = @execstatementsbatch + 'EXEC SP_NAME' + P1 + ' '+ P2 +',' + P3 +“; “ FROM ..

    EXEC(@execstatementsbatch)

但是你要知道,都是不适合的情况下,你有大量的数据工作性能非常好。

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 
相关问题