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
相关产品推荐
相关产品推荐

