我有一個生成SELECT
語句的CTE,但SQL Server(2012)不允許在其上調用EXEC
。這裏的查詢:如果我取消CTE後SELECT
聲明如何執行在CTE中生成的查詢
DECLARE @guidToFind uniqueidentifier = 'E4069560-091A-4026-B519-104F1C7693B3';
WITH GuidCols (TableName, ColName, Query) As
(
SELECT
C.TABLE_NAME,
C.COLUMN_NAME,
'SELECT ' +
QUOTENAME(C.TABLE_NAME) + '.' +
QUOTENAME(C.COLUMN_NAME) + '
FROM ' +
QUOTENAME(C.TABLE_NAME) + '
WHERE ' +
QUOTENAME(C.COLUMN_NAME) + ' = ''' + cast(@guidToFind AS VARCHAR(50))+
''''
FROM
INFORMATION_SCHEMA.COLUMNS C
INNER JOIN INFORMATION_SCHEMA.TABLES T
ON C.TABLE_NAME = T.TABLE_NAME AND
T.TABLE_TYPE = 'BASE TABLE'
WHERE
C.DATA_TYPE = 'uniqueidentifier'
)
-- SELECT * FROM
EXEC(GuidCols.Query)
的問題沒有解決。
此查詢的目的是查找數據庫中GUID的所有實例。目前我正在使用像this這樣的腳本來解決這個問題。但是,如果不通過行迭代,使用set操作和其他技術,我會更快樂地解決這個問題。
如果您只想知道包含該值的表和列,'EXISTS'可能是查找GUID實例的更有效的方法。你可以組合一個單獨的查詢,這個查詢包含'UNION'的所有結果,然後'EXECUTE'這個字符串。 – HABO 2012-07-26 02:51:39
@HABO感謝您的提示。你能解釋一下我可以在哪裏使用'EXISTS'?在第二部分中,你的意思是創建一個硬編碼的表和列的名字,例如''SELECT''[table1]',''[Col5]''UNION ALL SELECT''[table3]' ',''[Col8]''''? – 2012-07-26 04:17:56
@HABO我目前正在以這種方式實現這個:https://gist.github.com/3180402 但是我會更高興,如果我可以使用set操作而不是循環 – 2012-07-26 05:21:26