【发布时间】:2015-12-20 15:51:18
【问题描述】:
我有一个有效的大查询,我想为它编写一个存储过程。 我收到此错误:
链接服务器 "theServer" 的 OLE DB 提供程序 SQLNCLI11" 不包含表 ""@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'
这里传递的参数将在运行时设置/更新变量@dbName, @rid, @mdate。 (@mdate 我在查询中把它放在更远的地方,它太大了,无法用 myTable 调整它并更改所有敏感数据)。
我该怎么做? (使用 SQL Server 2012)
编辑(基于 cmets 和答案):
所以,它是 @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
【问题讨论】:
-
您不能在 T-SQL 中参数化 names。您必须将整个内容构建为一个大字符串并将其传递给
EXEC(也称为动态 SQL) -
我明白了,请看我的编辑,如果我明白了,请告诉我
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
哦,不知道。谢谢
标签: sql database stored-procedures dynamic sql-server-2012