![](/img/trans.png)
[英]Passing dynamic parameters to a stored procedure in SQL Server 2008
[英]SQL Server stored procedure passing parameters into variables
我有一個有效的大查詢,我想為此編寫一個存儲過程。 我收到此錯誤:
鏈接服務器“ 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)
編輯(基於評論和答案):
因此,它是@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
嗎?
我問是因為它不起作用。 我得到的名字' --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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.