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

C#执行SQL报错'Must declare the table variable "@RestoreList"'求解

问题原因

你代码的核心问题是每次为Cmd.CommandText赋值时都会直接覆盖上一次的内容,并不是将多条SQL语句拼接在一起。最终提交到SQL Server执行的只有最后一行语句:SELECT * FROM @RestoreList;,前面的@RestoreList表变量声明、@command变量赋值、插入数据的逻辑全部没有被执行,自然会抛出「必须声明表变量@RestoreList」的报错。

修复方案

把所有要执行的SQL语句拼接为一个完整的字符串,再一次性赋值给Cmd.CommandText即可,参考修正后的代码:

Cmd.Connection = Cnx;
// 把所有SQL语句拼接为一个完整逐字字符串
Cmd.CommandText = @"
DECLARE @command varchar(5000);
DECLARE @RestoreList TABLE(DB_name VARCHAR(100), RS_name VARCHAR(100), RS_DateCloture DATETIME);
SELECT @command = 'IF ''?'' IN (SELECT name FROM sys.databases WHERE HAS_DBACCESS(name) = 1 AND CASE WHEN state_desc = ''ONLINE'' THEN OBJECT_ID( QUOTENAME( name ) + ''.[dbo].[P_DOSSIER]'',''U'' ) END IS NOT NULL) BEGIN USE [?] SELECT DB_name = CAST(DB_NAME() AS VARCHAR(100)), RS_name = CAST(D_RaisonSoc AS VARCHAR(100)), RS_DateCloture = CAST((SELECT Max(v) FROM (VALUES ([D_FinExo01]), ([D_FinExo02]), ([D_FinExo03]),([D_FinExo04]),([D_FinExo05])) AS value(v)) AS DATETIME) FROM [?].[dbo].[P_DOSSIER] END';
INSERT INTO @RestoreList EXEC sp_MSforeachdb @command;
SELECT * FROM @RestoreList;
";

SqlDataReader reader = Cmd.ExecuteReader();

如果不习惯用逐字字符串(@开头的字符串),也可以用+拼接多段SQL字符串,注意保留语句末尾的分号避免语法错误即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:45:04