You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动将当前数据库名传入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;

关键修正说明

  1. OPENROWSET参数拆分:OPENROWSET的第二个参数是连接字符串,第三个是要执行的SQL命令,二者是独立参数,不能合并为一个变量传入。
  2. 单引号转义:动态SQL中所有实际需要的单引号都要写成两个单引号,避免语法解析错误。
  3. QUOTENAME()防护:用该函数包裹数据库名,既能自动处理含特殊字符的数据库名,也能防范SQL注入风险。
  4. 动态SQL执行:由于OPENROWSET不支持直接使用变量参数,必须把整个SELECT INTO语句构造为动态SQL,通过sp_executesql执行。

内容的提问来源于stack exchange,提问作者unknown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:41:21