我正在尝试将数据库名称作为参数传递并执行一些动态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执行的。
答案 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
不会从用户输入中收到,因为这会受到注入攻击。