如何自动将当前数据库名传入OPENROWSET的存储过程调用?
解决OPENROWSET中动态替换当前数据库名的问题
你的问题主要出在两个核心点:一是错误地将OPENROWSET的连接字符串与执行SQL合并为单个变量,且赋值语句语法违规;二是OPENROWSET不支持直接传入变量作为参数,必须通过动态SQL构造完整执行逻辑。下面是修正后的解决方案:
简化方案:直接用DB_NAME()获取当前数据库
没必要额外编写存储过程,DB_NAME()函数可以直接返回当前数据库名,简洁高效:
DECLARE @CurrentDB NVARCHAR(128) = DB_NAME(); DECLARE @DynamicSQL NVARCHAR(MAX); -- 构造动态SQL,注意单引号转义(两个单引号等价于一个实际单引号) SET @DynamicSQL = N' SELECT * INTO #WL_Klijenti FROM OPENROWSET (''SQLOLEDB'', ''Server=(local);TRUSTED_CONNECTION=YES;'', ''SET FMTONLY OFF; SET NOCOUNT ON; EXEC ' + QUOTENAME(@CurrentDB) + N'.dbo.sp_kbbl_WachLista_Priprema ''''2017.09.30'''', ''''2017.09.30'''', 0'' ) AS tbl; -- 这里可添加对临时表#WL_Klijenti的后续操作 SELECT * FROM #WL_Klijenti; '; -- 执行动态SQL EXEC sp_executesql @DynamicSQL;
若坚持使用你的getCurrentDB存储过程
如果一定要保留自己写的存储过程获取数据库名,可按以下方式调整:
DECLARE @dbName VARCHAR(30); EXEC getCurrentDB @dbName OUTPUT; DECLARE @DynamicSQL NVARCHAR(MAX); SET @DynamicSQL = N' SELECT * INTO #WL_Klijenti FROM OPENROWSET (''SQLOLEDB'', ''Server=(local);TRUSTED_CONNECTION=YES;'', ''SET FMTONLY OFF; SET NOCOUNT ON; EXEC ' + QUOTENAME(@dbName) + N'.dbo.sp_kbbl_WachLista_Priprema ''''2017.09.30'''', ''''2017.09.30'''', 0'' ) AS tbl; SELECT * FROM #WL_Klijenti; '; EXEC sp_executesql @DynamicSQL;
关键修正说明
- OPENROWSET参数拆分:OPENROWSET的第二个参数是连接字符串,第三个是要执行的SQL命令,二者是独立参数,不能合并为一个变量传入。
- 单引号转义:动态SQL中所有实际需要的单引号都要写成两个单引号,避免语法解析错误。
- QUOTENAME()防护:用该函数包裹数据库名,既能自动处理含特殊字符的数据库名,也能防范SQL注入风险。
- 动态SQL执行:由于OPENROWSET不支持直接使用变量参数,必须把整个
SELECT INTO语句构造为动态SQL,通过sp_executesql执行。
内容的提问来源于stack exchange,提问作者unknown
相关产品推荐
相关产品推荐

