SQL Server存储过程将参数传递给变量

时间:2015-09-23 10:55:24

标签: sql database stored-procedures dynamic sql-server-2012

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

  

OLE DB提供程序SQLNCLI11"对于链接服务器" theServer"不包含表"" @dbName"。" dbo"。" tableName"

我想做什么:

var FirebaseTokenGenerator = require("firebase-token-generator");
var tokenGenerator = new FirebaseTokenGenerator("<YOUR_FIREBASE_SECRET>");
var token = tokenGenerator.createToken({ uid: "uniqueId1", some: "arbitrary", data: "here" });

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' 。 (@mdate我在查询中有更远的地方,它太大了,无法使用myTable进行调整并更改所有敏感数据)。

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

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

所以,它是@dbName, @rid, @mdate。然后,在我的情况下,我如何根据查询内的参数设置这些变量?我应该替换吗?像这样:@thatString = '--insert the query here '

**

编辑2

**

set @thatString= replace(@thatString, dbName, @dbname)

我做对了吗?是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

1 个答案:

答案 0 :(得分:0)

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

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

-

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

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

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

或者如果你将大量使用这个名字,你可以减少因打入和退出单引号而造成的麻烦,如下所示 - 尽管我个人从不使用它,因为我不喜欢它的样子: / p>

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);