存在列名时出现错误“无效的列名”

时间:2019-09-05 07:45:35

标签: sql-server tsql

IF OBJECT_ID('tempdb..#TABLES') IS NOT NULL
DROP TABLE #TABLES
SELECT  TABLE_NAME,ROW_NUMBER()OVER(ORDER BY (SELECT 1)) AS RNUM into #Tables  FROM INFORMATION_SCHEMA.COLUMNS  WHERE COLUMN_NAME Like '%Client_ID%' Or COLUMN_NAME Like '%ClientID%' AND
TABLE_NAME NOT LIKE 'CR%' AND TABLE_NAME NOT LIKE 'Z%' AND TABLE_NAME NOT LIKE '%_CHANGE'
AND TABLE_NAME NOT LIKE 'VW%'

IF OBJECT_ID('tempdb..#finaldata') IS NOT NULL
DROP TABLE #finaldata
CREATE TABLE #finaldata(table_name VARCHAR(100),noofrows INT,Last_modified DATETIME)


DECLARE @start INT=1,@end INT,@tablename VARCHAR(100),@Client_ID     INT=1124,@query VARCHAR(MAX)
SELECT @end=MAX(RNUM) FROM #Tables 
WHILE @start<=@end
BEGIN
SELECT @tablename=TABLE_NAME FROM #Tables WHERE RNUM=@start

SELECT @query=CONCAT('INSERT INTO #finaldata(table_name,noofrows)
SELECT ','''',@tablename,'''',' ,COUNT(1) FROM ',@tablename ,'     WITH(NOLOCK) WHERE Client_id=',@Client_ID)

EXEC(@query)
SELECT @start=@start+1
END

select * from #finaldata where noofrows>0

--select * from FORM_DETAIL where Client_id = -1 

结果就像

  

1行受影响
   1行受影响
   错误207,级别16,列名client_id无效。

1 个答案:

答案 0 :(得分:1)

@HoneyBadger正确评论,您正在搜索多个列名,但已将单个列名硬编码到动态SQL中。

您可以通过将列名和表名一起存储,然后在动态SQL中使用它来按以下方式更正此问题:

IF OBJECT_ID('tempdb..#TABLES') IS NOT NULL BEGIN
  DROP TABLE #TABLES;
END

-- I assume you want brackets as I have shown below to ensure the 'and-ed' conditions apply to both 'or-ed' conditions    
SELECT TABLE_NAME, COLUMN_NAME, ROW_NUMBER()OVER(ORDER BY (SELECT 1)) AS RNUM
into #Tables
FROM INFORMATION_SCHEMA.COLUMNS
WHERE (COLUMN_NAME Like '%Client_ID%' Or COLUMN_NAME Like '%ClientID%')
AND TABLE_NAME NOT LIKE 'CR%' AND TABLE_NAME NOT LIKE 'Z%' AND TABLE_NAME NOT LIKE '%_CHANGE'
AND TABLE_NAME NOT LIKE 'VW%';

IF OBJECT_ID('tempdb..#finaldata') IS NOT NULL BEGIN
  DROP TABLE #finaldata;
END

CREATE TABLE #finaldata(table_name VARCHAR(100), noofrows INT, Last_modified DATETIME);

DECLARE @start INT=1, @end INT, @tablename VARCHAR(100), @columnname VARCHAR(100), @Client_ID INT=1124, @query VARCHAR(MAX);

SELECT @end = MAX(RNUM)
FROM #Tables;

WHILE @start <= @end BEGIN
  SELECT @tablename=TABLE_NAME, @columnname = COLUMN_NAME FROM #Tables WHERE RNUM = @start;

  SELECT @query = CONCAT('INSERT INTO #finaldata(table_name, noofrows)
    SELECT ','''',@tablename,'''',', COUNT(1) FROM ', @tablename, ' WITH (NOLOCK) WHERE ' + @columnname + ' = ', @Client_ID);

  print(@Query)
  --EXEC(@query);
  SELECT @start=@start+1;
END

select * from #finaldata where noofrows>0