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