Sql 动态表名被识别为列名

Sql 动态表名被识别为列名,sql,dynamic-sql,Sql,Dynamic Sql,以下脚本中的动态架构和表名被识别为列名的原因是什么?如果我在动态脚本之外的模式和表名中硬编码,则函数不会执行任何问题 错误=Msg 207,16级,状态1,第38行 列名“55_数据集”无效。 Msg 207,16级,状态1,第38行 列名“epapority”无效。 在每次迭代中重复 表格示例 DECLARE@Counter INT; 声明@DATASET nvarchar(50); 声明@STATE nvarchar(50); 声明@sql nvarchar(最大值); 设置@Counter

以下脚本中的动态架构和表名被识别为列名的原因是什么?如果我在动态脚本之外的模式和表名中硬编码,则函数不会执行任何问题

错误=Msg 207,16级,状态1,第38行 列名“55_数据集”无效。 Msg 207,16级,状态1,第38行 列名“epapority”无效。 在每次迭代中重复

表格示例

DECLARE@Counter INT;
声明@DATASET nvarchar(50);
声明@STATE nvarchar(50);
声明@sql nvarchar(最大值);
设置@Counter=1;
而@Counter SQL server版本
看来没问题

检查
设置前

我试试看:

CREATE TABLE EPA_Geocoding_Progress(
    Geocoded  int
);

CREATE TABLE TEST(
    ID  int
);



如果您要使用如下打印方式编码:

declare @sql varchar(max)
declare @STATE varchar(50)
declare @DATASET varchar(50)
set @STATE = 'dbo'
set @DATASET = 'test'
Set @sql = '
UPDATE [dbo].[EPA_Geocoding_Progress] 
Set [Geocoded] = (Select COUNT (*) FROM [' + @STATE + '].[' + @DATASET + '])'
   print @sql;

您将看到问题所在。

您能发布遇到的真实消息吗?并标记您正在使用的数据库?确保使用QUOTENAME函数正确生成了状态和数据集变量,并从文本表达式中删除括号。如果某个州的名称中包含“]”,则该州将无法正确解释为“原样”。
Declare @sql nvarchar(max) = ''
,@STATE nvarchar(max) = 'dbo'
,@DATASET nvarchar(max) = 'test' 
Set @sql = '
UPDATE [dbo].[EPA_Geocoding_Progress] 
Set [Geocoded] = (Select COUNT (*) FROM [' + @STATE + '].[' + @DATASET + '])'
select @sql
exec sp_executesql @sql; -- Run Success
declare @sql varchar(max)
declare @STATE varchar(50)
declare @DATASET varchar(50)
set @STATE = 'dbo'
set @DATASET = 'test'
Set @sql = '
UPDATE [dbo].[EPA_Geocoding_Progress] 
Set [Geocoded] = (Select COUNT (*) FROM [' + @STATE + '].[' + @DATASET + '])'
   print @sql;