2017-06-14 256 views
0

我只有35个表,但是当我运行下面列出的查询时,出现此错误。查询处理器耗尽内部资源,无法生成查询计划。这是一个罕见的事件,并且只能用于引用大量表或分区的极其复杂的查询或查询。请简化查询。如果您认为您错误地收到了此消息,请联系客户支持服务以获取更多信息。我怎样才能避免这个错误?查询INFORMATION_SCHEMA.COLUMNS并获取错误“查询处理器用完内部资源,无法生成查询计划”

CREATE TABLE DemoTable 
(
    ID INT identity(1,1), 
    col nvarchar(20) 
) 
*/ 

/*INSERT INTO DemoTable VALUES 
('P000092436'), 
('123466'), 
('123456'), 
('P000092436'), 
('13456'), 
('P000092436')*/ 

DECLARE @SearchStr nvarchar(100) = '92436', 
     @SQL nvarchar(max) = '' 

/*SELECT @SQL = @SQL + 
'UNION 
SELECT '''+ QUOTENAME(t.TABLE_SCHEMA) +'.'+ QUOTENAME(c.TABLE_NAME) +'.'+QUOTENAME(c.COLUMN_NAME) +''' As ColumnName, 
'''+ @SearchStr +''' As ColumnValue, 
(SELECT * FROM '+ QUOTENAME(c.TABLE_NAME) +' WHERE '+ QUOTENAME(c.COLUMN_NAME) +' LIKE ''%'+ @SearchStr +'%'' FOR XML AUTO) 
FROM '+ QUOTENAME(c.TABLE_NAME) +' 
WHERE '+ QUOTENAME(c.COLUMN_NAME) +' LIKE ''%'+ @SearchStr +'%''*/ 
SELECT @SQL = @SQL + 
'UNION 
SELECT '''+ t.TABLE_SCHEMA +'.'+ c.TABLE_NAME +'.'+c.COLUMN_NAME +''' As ColumnName, 
'''+ @SearchStr +''' As ColumnValue, ' + '''<'' + ' + 'CAST(' + ' 
(SELECT ' + n.LIST_COLUMN + 'FROM '+ c.TABLE_NAME +' WHERE '+ c.COLUMN_NAME +' LIKE ''%'+ @SearchStr +'%'' FOR XML PATH(''''), TYPE) AS VARCHAR(MAX)) + ''/>'' 
FROM '+ c.TABLE_NAME +' 
WHERE '+ c.COLUMN_NAME +' LIKE ''%'+ @SearchStr +'%'' 
' 
--SELECT c.COLUMN_NAME, t.TABLE_NAME, n.LIST_COLUMN 
FROM INFORMATION_SCHEMA.COLUMNS c 
INNER JOIN INFORMATION_SCHEMA.TABLES t ON c.TABLE_NAME = t.TABLE_NAME 
INNER JOIN 
(
select 
b.TABLE_NAME, 
stuff((select ',''"'' + CAST('+ a.COLUMN_NAME + ' AS VARCHAR(200)) + ''",''' 
     from INFORMATION_SCHEMA.COLUMNS a 
     where a.TABLE_NAME = b.TABLE_NAME 
     For XML PATH('')),1,1,'') LIST_COLUMN 
from (select distinct TABLE_NAME from INFORMATION_SCHEMA.COLUMNS) b 
) n ON n.TABLE_NAME = c.TABLE_NAME 

WHERE t.TABLE_TYPE = 'BASE TABLE'; 

SET @SQL = STUFF(@SQL, 1, 7, '') 

IF OBJECT_ID('tempdb..#SearchResults') IS NOT NULL 
    /*Then it exists*/ 
DROP TABLE #SearchResults 

CREATE TABLE #SearchResults 
(
    ColumnName nvarchar(500), 
    ColumnValue nvarchar(100), 
    --RowContent XML 
    RowContent nvarchar(max) 
) 
PRINT @SQL; 
INSERT INTO #SearchResults 
EXEC(@SQL) 

SELECT * 
FROM #SearchResults 

回答

1

目前还不清楚你的目标是什么与这个查询,但UNION stament是非常昂贵的。你需要重写查询。

也许你可以使用BEGIN/END来填充你的表格逐行进行评估。