T-SQL - Как преобразовать операторы SELECT, хранящиеся в ячейках таблицы, в результат? - PullRequest
0 голосов
/ 10 октября 2018

У меня есть таблица, которая имеет 2 столбца.Первый - это идентификатор, а второй - оператор SQL SELECT, связанный с этим идентификатором.Мне нужна какая-то функция или процедура, которая может анализировать каждую строку и превращать каждый оператор SELECT в вывод.

Я использую MS SQL Server 2016

Пример имени таблицы: Test

|-----------|---------------------------------------------------------- |
|     ID    |                           SQL                             |
|-----------|-----------------------------------------------------------|
|      1    | SELECT COUNT(*) FROM dbo.Example WHERE SomeFilter = 'A'   |
|-----------|-----------------------------------------------------------|
|      2    | SELECT COUNT(*) FROM dbo.Example WHERE SomeFilter = 'B'   |
|-----------|-----------------------------------------------------------|

Я могу получить один результат на строку, используя приведенный ниже код, но я ищу процедуру, которая может обработать всю таблицу и вывести результат для каждой записи

DECLARE @SQL NVARCHAR(MAX)
SET @SQL = (SELECT [SQL] FROM [dbo].[Test])
EXECUTE sp_executesql @SQL

Требуемый вывод

|-----------|---------------------------------------------------------- |--------------|
|     ID    |                           SQL                             |     Output   |
|-----------|-----------------------------------------------------------|--------------|
|      1    | SELECT COUNT(*) FROM dbo.Example WHERE SomeFilter = 'A'   |              |
|-----------|-----------------------------------------------------------|--------------|
|      2    | SELECT COUNT(*) FROM dbo.Example WHERE SomeFilter = 'B'   |              |
|-----------|-----------------------------------------------------------|--------------|

Возможно ли что-то подобное?Если да - любая помощь с указанием шагов будет принята с благодарностью.Как уже упоминалось, я могу получить построчный специальный результат для каждой строки, но мне нужен автоматизированный метод для анализа всей таблицы и возврата дополнительного столбца с результатами каждого запроса SQL.

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Надеюсь, это то, что вы просили

Create Procedure gen_SQL_STM
AS 
    DECLARE @stmList CURSOR;
    DECLARE @id varchar(max);
    DECLARE @sql varchar(max);
    DECLARE @counts int;

    BEGIN
        SET @stmList = CURSOR FOR
        SELECT stm.id, stm.sqlCol
        from testTable stm  

    OPEN @stmList 
    FETCH NEXT FROM @stmList 
    INTO @id, @sql
    WHILE @@FETCH_STATUS = 0
    BEGIN

        EXECUTE sp_executesql @sql= @counts OUTPUT
        INSERT INTO testTable2(id, sqlstm, MYoutput_count)
        SELECT @id, @sql, @counts
        FETCH NEXT FROM @stmList
        INTO @id, @sql 
    END; 
    CLOSE @stmList ;
    DEALLOCATE @stmList;
    END;
GO
0 голосов
/ 10 октября 2018

Вы можете использовать простой механизм зацикливания, упомянутый Гордоном.

DECLARE @ID INT = 1
DECLARE @MAXID INT = (SELECT MAX(ID) FROM dbo.Test)
DECLARE @SQL NVARCHAR(MAX)

CREATE TABLE #TMP (count_records INT, id_from_source INT)

WHILE @ID <= @MAXID 
BEGIN
    SELECT @SQL = (SELECT SQL FROM Test WHERE ID = @ID)
    IF @SQL IS NOT NULL 
    BEGIN
        INSERT #TMP (count_records)
        EXECUTE sp_executesql @SQL
        UPDATE #TMP SET id_from_source = @ID WHERE id_from_source IS NULL
    END
    SET @ID = @ID + 1
END

SELECT * FROM #TMP
...