簡體   English   中英

數據庫名稱作為存儲過程中的參數 SQL 服務器

[英]Db Name as parameter in stored procedure SQL Server

我希望將我的數據庫名稱作為參數傳遞給存儲過程,並且我希望在 where 條件下使用它來設置存儲過程的數據庫。 但我得到一個錯誤:

'.' 附近的語法不正確

示例代碼

Create proc [dbo].[stored_procedure_one]
    @variable1 int,
    @dbname varchar(10)
as
begin
    select * 
    from @dbname..table_name
End

有人可以建議我如何解決這個問題嗎?

您將需要使用動態sql來執行類似以下操作。

Create proc [dbo].[stored_procedure_one]
    @variable1 int,
    @dbname    SYSNAME  --<-- use appropriate data type for object names
as
begin
  DECLARE @Sql NVARCHAR(MAX);

 SET @Sql = N' select * from ' + QUOTENAME(@dbname) + N'..table_name'

 Exec sp_executesql @Sql

End

還可以使用QUOTENAME()函數來保護自己免受可能的sql-injection攻擊。

只是為了提供一個替代方案,有趣的是EXEC可以將字符串作為要執行的內容,例如:

DECLARE @sp nvarchar(255) = N'sys.sp_who2';
EXEC @sp;

它還可以帶參數,例如

DECLARE @sp nvarchar(255) = N'sys.sp_who2';
EXEC @sp 'active';

因此,我們可以使用以下方法動態構建運行命令的上下文:

DECLARE @dbname sysname = N'tempdb';
DECLARE @context nvarchar(1000) = QUOTENAME(@dbname)
  + N'.sys.sp_executesql';

DECLARE @sql nvarchar(max) = N'SELECT DB_NAME();';

EXEC @context @sql;

你也可以傳遞參數:

DECLARE @dbname sysname = N'tempdb';
DECLARE @context nvarchar(1000) = QUOTENAME(@dbname)
  + N'.sys.sp_executesql';

DECLARE @sql nvarchar(max) = N'SELECT DB_NAME(), @x;';

EXEC @context @sql, N'@x int', 5;

這種方法確實簡化了諸如在各處連接數據庫名稱、避免特定於數據庫的函數(如 object_name)之類的事情,並確保您的整個命令在另一個數據庫中運行 您也可以跨鏈接服務器執行此操作,例如:

DECLARE @server sysname = N'linked_server';
DECLARE @dbname sysname = N'tempdb';
DECLARE @context nvarchar(1000) = QUOTENAME(@server)
  + N'.' + QUOTENAME(@dbname)
  + N'.sys.sp_executesql';
...

暫無
暫無

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

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