我有一个很大的查询,我想为它编写一个存储过程。 我收到此错误:
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 '
?
**
**
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
答案 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);