Как сохранить результат динамического SQL в переменной в T-SQL?

У меня есть хранимая процедура, которая принимает "имя таблицы" в качестве параметра. Я хочу сохранить результаты exec в переменной и отображать ее с помощью этой переменной. Вот моя хранимая процедура T-SQL.

create procedure  DisplayTable( @tab varchar(30))
as
begin
   Declare @Query VARCHAR(30)
   set @Query='select * from ' +@tab
   EXEC (@Query)
END

Я хочу сделать что-то вроде этого..

SET @QueryResult = EXEC (@Query)
select @QueryResult

Как мне этого добиться.. Пожалуйста, помогите.. Я новичок..


person Uthaiah    schedule 13.05.2014    source источник
comment
Нет простого\практичного способа сделать это. Это потому, что то, что вы пытаетесь сделать, не вписывается идеально в парадигму SQL. Если вы подумаете немного дальше, вы увидите, что вам понадобится динамически структурированная табличная переменная, а поскольку ее схема неизвестна, вам также нужно будет запросить ее с помощью динамического SQL! - ПС. Не говоря уже о том, что это невозможно, просто это непрактично и не элегантно.   -  person MarkD    schedule 13.05.2014
comment
То, что вы спрашиваете, похоже на то, как мне создать процедуру, которая запрашивает некоторые неопределенные данные и возвращает неопределенный результат в ограниченной строке? Я согласен, что это возможно; но я не могу придумать ничего близкого к тому, чтобы это сделать.   -  person user2338816    schedule 13.05.2014


Ответы (3)


Вы можете использовать XML для этого. Просто добавьте, например. «FOR XML AUTO» в конце вашего SELECT. Это не табличный формат, но, по крайней мере, он соответствует вашим требованиям и позволяет запрашивать и даже обновлять результат. Поддержка XML в SQL Server очень сильна, просто ознакомьтесь с этой темой. Вы можете начать здесь: http://technet.microsoft.com/en-us/library/ms178107.aspx

person Endrju    schedule 13.05.2014

alter procedure  DisplayTable( 
    @tab varchar(30)
    ,@query varchar(max) output
)
as
BEGIN
  Declare @execution varchar(max) = 'select * from ' +@tab

    declare @tempStructure as table (
        pk_id int identity
        ,ColumnName varchar(max)
        ,ColumnDataType varchar(max)
    )

    insert into
        @tempStructure
    select
        COLUMN_NAME
        ,DATA_TYPE
    from 
        INFORMATION_SCHEMA.columns
    where TABLE_NAME= @tab

  EXEC(@execution)

  declare @ColumnCount int = (SELECT count(*) from @tempStructure)
  declare @counter int = 1
  while @counter <= @ColumnCount
  BEGIN
    IF @counter = 1
    BEGIN
        set @query = (SELECT ColumnName + ' ' + ColumnDataType FROM @tempStructure where pk_id= @counter)
    END
    IF @counter <> 1
    BEGIN
        set @query = @query +  (SELECT ',' + ColumnName + ' ' + ColumnDataType FROM @tempStructure where @counter = pk_id)
    END
    set @counter = @counter + 1
  END
END

Когда вы выполните SP, вы теперь получите структуру таблицы, которую вы хотите.

Надеюсь, это должно заставить вас двигаться.

Если вы хотите включить таблицу CONTENTS, создайте цикл для записей и добавьте их к параметру @query.

Не забудьте разделить @query, иначе, когда вы прочитаете его позже, вы не сможете реструктурировать свою таблицу.

person oliversarfas    schedule 08.10.2014

Прежде всего, вы должны понимать, что вы не можете просто хранить значение SELECTв таблице в простой переменной. Это должна быть переменная TABLE, которая может хранить значение SELECTзапроса.

Попробуйте следующее:

select 'name1' name, 12 age
into MyTable
union select 'name2', 15 union
select 'name3', 19

--declaring the table variable and selecting out of it..

declare @QueryResult table(name varchar(30), age int)
insert @QueryResult exec DisplayTable 'MyTable'
select * from @QueryResult

Надеюсь это поможет!

person SouravA    schedule 08.10.2014