簡體   English   中英

SQL Server存儲過程將參數傳遞給變量

[英]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)

**

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM