5

我有一个SELECT生成语句的 CTE,但 SQL Server (2012) 不允许调用EXEC它。这是查询:

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 )

SELECT如果我在 CTE 之后取消注释该语句,则问题无法解决。

此查询的目的是查找数据库中 GUID 的所有实例。目前我正在使用这样的脚本解决这个问题。但是,我会更乐意在不遍历行、使用集合操作和其他技术的情况下解决这个问题。

4

4 回答 4

5

您不能将exec其用作CTE.

来自WITH common_table_expression (Transact-SQL)

CTE 后面必须跟一个引用部分或全部 CTE 列的 SELECT、INSERT、UPDATE 或 DELETE 语句。

您可以做的是将查询的结果存储在临时表中,遍历行并一次执行一条语句。

于 2012-07-26T12:14:33.270 回答
1

EXEC() 函数可从 T-SQL 获得,但不能从 SQL 语句中访问。我会假设是这种情况,因为 SQL 是分几个步骤执行的……比如:

  1. 您的陈述已被解析。
  2. 生成执行计划。
  3. 针对数据库运行执行计划并返回结果。

EXEC() 函数旨在动态执行语句,因此为了执行您的要求,SQL Server 必须执行前两个步骤,然后在执行语句时,它必须返回到第一个解析/执行动态语句的步骤。这必须为结果中的每一行重复。

我认为这种类型的“功能”不可用,因为它可能会对数据库引擎的性能和复杂性产生不利影响;所以他们让我们执行第一条语句,然后循环遍历每条记录以单独执行动态语句。

于 2012-07-26T03:11:07.163 回答
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-execute-对于-sp-总是/

于 2012-07-26T03:21:36.080 回答
1

您可以使用 OPENQUERY 而不是 EXEC:

SELECT * FROM OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE name = ''NewTitle''');

参考:https ://docs.microsoft.com/en-us/sql/t-sql/functions/openquery-transact-sql?view=sql-server-2017

于 2018-10-17T04:10:13.923 回答