2012-07-26 58 views
3

我有一個生成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操作和其他技術,我會更快樂地解決這個問題。

+0

如果您只想知道包含該值的表和列,'EXISTS'可能是查找GUID實例的更有效的方法。你可以組合一個單獨的查詢,這個查詢包含'UNION'的所有結果,然後'EXECUTE'這個字符串。 – HABO 2012-07-26 02:51:39

+0

@HABO感謝您的提示。你能解釋一下我可以在哪裏使用'EXISTS'?在第二部分中,你的意思是創建一個硬編碼的表和列的名字,例如''SELECT''[table1]',''[Col5]''UNION ALL SELECT''[table3]' ',''[Col8]''''? – 2012-07-26 04:17:56

+0

@HABO我目前正在以這種方式實現這個:https://gist.github.com/3180402 但是我會更高興,如果我可以使用set操作而不是循環 – 2012-07-26 05:21:26

回答

4

不能使用exec作爲CTE的一部分。

WITH common_table_expression (Transact-SQL)

的CTE必須跟一個SELECT,INSERT,UPDATE或DELETE語句 引用部分或全部CTE列。

您可以改爲將查詢結果存儲在臨時表中,循環遍歷行並一次執行一條語句。

1

EXEC()函數可從T-SQL獲得,但不能從SQL語句內訪問。我會假設情況是這樣的,因爲SQL分幾步執行......類似於:

  1. 您的語句被解析。
  2. 生成執行計劃。
  3. 對數據庫運行執行計劃並返回結果。

EXEC()函數被設計爲動態執行一個語句,所以爲了做你所要求的,SQL Server將不得不執行前兩個步驟,然後在執行語句時,它會有返回到解析/執行動態語句的第一步。這將不得不在結果中的每一行重複。

我認爲這種'功能'是不可用的,因爲它可能會對數據庫引擎的性能和複雜性產生負面影響;所以他們讓我們執行第一條語句,然後遍歷每條記錄分別執行動態語句。

1

Exec執行一個嵌入其括號中的T-SQL命令。不同之處在於EXEC()函數可以執行字符串或字符串變量,就像您在前面的代碼中看到的那樣。 EXEC()的參數可以是一個字面字符串,但是當你使用一個變量時,EXEC()的真正威力就會變得明顯。

它執行包含在變量中的命令,但是在與調用該函數的會話不同的上下文中。這很重要,因爲它引入了一些嚴重的限制。任何創建的表都可以在EXEC()上下文中看到,但調用會話聲明的變量對EXEC()上下文不可見,反之亦然。

我發現在與此相關的一個有趣的文章:http://msdn.microsoft.com/en-us/library/aa175921(v=sql.80).aspx

雖然以上是自給自足的,你也可以去通過:http://blog.sqlauthority.com/2007/09/13/sql-server-difference-between-exec-and-execute-vs-exec-use-execexecute-for-sp-always/