动态表名称被识别为列名称

时间:2018-05-21 06:12:33

标签: sql dynamic-sql

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

错误=消息207,级别16,状态1,行38 列名称“55_Dataset”无效。 Msg 207,Level 16,State 1,Line 38 列名称'EPAPRIORITY'无效。 每次迭代重复

表示例enter image description here

DECLARE @Counter INT;
DECLARE @DATASET nvarchar(50);
DECLARE @STATE nvarchar(50);
DECLARE @sql nvarchar(max);
SET @Counter = 1;

WHILE @Counter <= 10

BEGIN

SET @DATASET = (Select [DATASET] FROM [xxx].[dbo].[EPA_Geocoding_Progress] Where [INT] = @Counter)
SET @STATE = (Select [STATE] FROM [xxx].[dbo].[EPA_Geocoding_Progress] Where [INT] = @Counter)
SET @sql = '
UPDATE [xxx].[dbo].[EPA_Geocoding_Progress] 
Set [Geocoded] = (Select COUNT (*) FROM [xxx].[' + @STATE + '].[' + @DATASET + '])
Where [STATE] =  [' + @STATE + '] AND [DATASET] = [' + @DATASET + ']'
exec sp_executesql @sql;

SET @Counter = @Counter + 1;


END

2 个答案:

答案 0 :(得分:0)

SQL server Version

似乎没问题

在设置

之前检查;

我试试看:

CREATE TABLE EPA_Geocoding_Progress(
    Geocoded  int
);

CREATE TABLE TEST(
    ID  int
);
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

DEMO SQL Fiddle

答案 1 :(得分:-1)

如果您要使用这样的打印代码:

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;

你会看到错误。