Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行sql查询中返回的sql_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

执行sql查询中返回的sql

执行sql查询中返回的sql,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个针对sql server数据库运行的查询,该数据库为返回的查询的每一行生成一条sql语句 例如 等 在同一脚本中,如何执行查询中返回的sql?签出将结果转储到varcharmax或nvarcharmax类型的变量中,然后执行它们 -- Create a terrible, horrible cursor to run the statements -- You have just now killed a kitten DECLARE Csr cursor for SELECT

我有一个针对sql server数据库运行的查询,该数据库为返回的查询的每一行生成一条sql语句

例如


在同一脚本中,如何执行查询中返回的sql?

签出

将结果转储到varcharmax或nvarcharmax类型的变量中,然后执行它们

-- Create a terrible, horrible cursor to run the statements
-- You have just now killed a kitten
DECLARE Csr cursor for
SELECT
    P.name AS proc_name
,   schema_name(P.schema_id) AS schemaname
FROM
    sys.procedures P


DECLARE @query varchar(max), @proc_name sysname, @schema sysname

OPEN Csr
FETCH NEXT FROM Csr INTO
    @proc_name, @schema

WHILE (@@fetch_status <> -1)
BEGIN
    IF (@@fetch_status <> -2)
    BEGIN
        BEGIN TRY
            -- build out the drop statement, may not be necc
            SET @query = 'DROP PROCEDURE' + QUOTENAME(@schema) + '.' + QUOTENAME(@proc_name)
            -- Actually run the dynamic query
            EXECUTE(@query)
        END TRY
        BEGIN CATCH
            -- Be good and note what failed, fix this manually
            PRINT 'This query failed'
            PRINT @query
        END CATCH
        FETCH NEXT FROM Csr INTO
            @proc_name, @schema
    END
END

CLOSE Csr
DEALLOCATE Csr

一种方法是,您必须遍历结果集并使用。不过很奇怪,您想要完成的是什么?您需要做的是将查询输出转换成一个变量。如果使用的是存储过程,请指定varchar的输出参数。然后,当调用存储过程以生成SQL查询时,只需将varchar变量传递给sp_executesql

-- Create a terrible, horrible cursor to run the statements
-- You have just now killed a kitten
DECLARE Csr cursor for
SELECT
    P.name AS proc_name
,   schema_name(P.schema_id) AS schemaname
FROM
    sys.procedures P


DECLARE @query varchar(max), @proc_name sysname, @schema sysname

OPEN Csr
FETCH NEXT FROM Csr INTO
    @proc_name, @schema

WHILE (@@fetch_status <> -1)
BEGIN
    IF (@@fetch_status <> -2)
    BEGIN
        BEGIN TRY
            -- build out the drop statement, may not be necc
            SET @query = 'DROP PROCEDURE' + QUOTENAME(@schema) + '.' + QUOTENAME(@proc_name)
            -- Actually run the dynamic query
            EXECUTE(@query)
        END TRY
        BEGIN CATCH
            -- Be good and note what failed, fix this manually
            PRINT 'This query failed'
            PRINT @query
        END CATCH
        FETCH NEXT FROM Csr INTO
            @proc_name, @schema
    END
END

CLOSE Csr
DEALLOCATE Csr