SQL 服务器存储过程将参数传递给变量

SQL Server stored procedure passing parameters into variables

我有一个有效的大查询,我想为它编写一个存储过程。 我收到此错误:

the OLE DB provider SQLNCLI11" for linked server "theServer" does not contain the table ""@dbName"."dbo"."tableName"

我想做什么:

create PROCEDURE [sys.sp_myProcedure] 
(
 @dbName varchar(30) output, 
 @rid varchar (10) output,
 @mdate output
 )
AS
BEGIN
declare @prt varchar(12)
declare @pid int
declare @cid int
--declare @rid int
declare @aid int

    SET NOCOUNT ON;
set @cid= (select CID from  theServer.[@dbName].dbo.tableName where RID= @rid)
set @pid= (select PID from  theServer.[@dbName].dbo.tableName where RID= @rid)
set @aid= (select aid from  theServer.[@dbName].dbo.tableName where RID= @rid)
--then my query begins

theServer.[@dbName].dbo.tablename 是链接服务器。

我想做的是:

execute [sys.sp_myProcedure] 'someDbname', '123', '2012-03-03'

此处传递的参数将在运行时 set/update 变量 @dbName, @rid, @mdate。 (@mdate 我在查询中把它放得更远了,它太大了,无法适应 myTable 并更改所有敏感数据)。

我该怎么做?? (使用 SQL Server 2012)

编辑(根据评论和答案):

所以,它是 @thatString = '--insert the query here '。那么,在我的例子中,我如何根据查询中的参数设置这些变量?我应该用替换来做吗?像这样:set @thatString= replace(@thatString, dbName, @dbname) ?

**

编辑 2

**

set @sql = '
use [someDbName];
use [123];
use [2012-03-03];

select ... '
set @sql = replace (@sql, 'someDbName', @dbName)
set @sql = replace (@sql, '123', @rid)
set @sql = replace (@sql, '2012-03-03', @mdate)
execute @sql
end

我做对了吗? execute @sql 在正确的位置吗?

我问是因为它不起作用。我正在获取名称 ' --part of my query here' is not a valid identifier

不能从变量中动态指定数据库或其他对象的名称。解决方法是在字符串中组成动态 SQL 查询,将所需名称连接到其中,然后 execute (@thatString).

(您可能认为可以使用 use,但它的范围如此之大,以至于您必须将其余查询包含在同一个执行的字符串中。)

--

根据要求编辑更多信息。您可以随意组合字符串。如果您需要更多指导,有很多讨论动态 T-SQL 的页面。但是,嘿,两个想法:

set @myDynamicQuery =
'
    use [' + @myDynamicDatabase + '];

    select BLAH from WHOM where DATA = ''what'';
';

或者如果你会经常使用这个名字,你可以减少单引号插入和退出所带来的麻烦,如下所示——尽管我个人从不使用它,因为我不喜欢它的样子:

set @myDynamicQuery =
'
    use [A_RARE_PLACEHOLDER];

    select BLAH from WHOM where DATA = ''what'';

    -- lots more uses of A_RARE_PLACEHOLDER
';

set @myDynamicQuery = replace(
    @myDynamicQuery,
    'A_RARE_PLACEHOLDER',
    @myDynamicDatabase
);

然后execute (@myDynamicQuery);