数据库名称的SQL变量

时间:2017-04-25 14:29:12

标签: sql-server

我正在尝试将数据库名称作为参数传递并执行一些动态SQL。作为测试我创建了这个:

1

按预期返回declare @HRMSDatabase_1 nvarchar(50) = N'FirstDatabase', @Example_1 nvarchar(max) = 'select @HRMSDatabase' execute sp_executesql @Example_1, N'@HRMSDatabase nvarchar(50)', @HRMSDatabase_1

当我尝试这个时:

FirstDatabase

我收到错误消息:

declare @HRMSDatabase_2 nvarchar(50) = N'FirstDatabase',
        @Example_2 nvarchar(max) =
'select 
      ''Test''
from 
    @HRMSDatabase.dbo.hrpersnl hp'

execute sp_executesql @Example_2, N'@HRMSDatabase nvarchar(50)', @HRMSDatabase_2

我想做的是什么?我不能简单地使用Msg 102, Level 15, State 1, Line 29 Incorrect syntax near '.'. ,因为我有一些数据库,我必须使用内部联接在相同的动态SQL中查询。

此外,我无法使用USE FirstDatabase,因为此脚本是从GUI执行的。

1 个答案:

答案 0 :(得分:1)

基本上,我不相信你可以在表格说明符中参数化数据库名称。相反,试试这个,

DECLARE @HRMSDatabase NVARCHAR(50) = N'FirstDatabase';
DECLARE @Example3 NVARCHAR(MAX) ='SELECT 
        ''Test''
    FROM 
        ' + QUOTENAME(@HRMSDatabase) + '.[dbo].[hrpersnl] hp';

EXEC sp_executesql @Example3;

正如您将注意到的,重要的是@HRMSDatabase不会从用户输入中收到,因为这会受到注入攻击。