2017-06-14 74 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來填充你的表格逐行進行評估。