2016-10-25 4 views
0

Я пытаюсь написать эту хранимую процедуру, но у меня есть проблема проходящее результат Темп таблицы (или табличной переменной) для EXEC (@SQL) задачи:Pass таблицы переменных для EXEC SQL Server

DECLARE @colsUnpivot AS NVARCHAR(MAX) 
    DECLARE @query AS NVARCHAR(MAX) 
    DECLARE @Table_Name as Varchar(200) 
    DECLARE @transaction_Table NVarchar(500) 

    SET @Table_Name = 'opd_scholar' 
    SET @transaction_Table = 'opd_scholar_transaction' 

    --DECLARE @TEMP TABLE(colsUnpivot varchar(max)) 
    CREATE TABLE #TEMP (colsUnpivot varchar(max)) 

    SELECT @colsUnpivot = 'SELECT 
    STUFF ((
      SELECT '', ''+ QUOTENAME(InTab.COLUMN_NAME) 
      FROM INFORMATION_SCHEMA.COLUMNS InTab 
      WHERE InTab.TABLE_NAME = OutTab.TABLE_NAME 
      ORDER BY InTab.ORDINAL_POSITION 
      FOR XML PATH(''''), TYPE 
      ).value(''.'',''VARCHAR(MAX)'' 
     ) , 1,1,SPACE(0)) 
    FROM INFORMATION_SCHEMA.COLUMNS OutTab 
    WHERE TABLE_NAME = '''+ @Table_Name +''' 
    GROUP BY OutTab.TABLE_NAME' 
    --INSERT INTO @TEMP (colsUnpivot) 
    INSERT INTO #TEMP (colsUnpivot) 
    EXEC(@colsUnpivot) 
    PRINT @colsUnpivot 
    --SELECT colsUnpivot FROM @TEMP 
    SELECT colsUnpivot FROM #TEMP 

    DECLARE @TEMP1 NVARCHAR(MAX) = 'SELECT colsUnpivot FROM #TEMP' 

    --PRINT @TEMP 

    SET @query 
    = 'INSERT INTO '+ @transaction_Table +' ( unitid,institution,city,state,zip,code_name,lkp_value) 
    SELECT unitid,institution,city,state,zip,code_name,lkp_value 
    FROM 
    (
    SELECT unitid,institution,city,state,zip, '+ @TEMP1+' 
    FROM '[email protected]_name+') AS cp 
    UNPIVOT (lkp_value for code_name IN ('[email protected]+') 
    ) AS up' 
    PRINT @Query 
--PRINT @Query1 
    EXEC(@query) 
    DROP TABLE #TEMP 

Я также использовал таблицу переменных (см прокомментировал область), но не уверен, как это работает.

Скопируйте и вставьте этот код в свое окно запроса, чтобы получить больше понимания. Thats right Hogan. Я хочу получить результат @colsUnpivot внутри некоторой переменной, чтобы я мог передать ее в следующий сегмент кода, где в настоящее время я использую @ TEMP1.

+0

'но у меня есть проблема проходящего результата от темпа table', вы можете объяснить, что это ваша проблема? – Lamak

+0

Что-то странное здесь, с одной стороны, похоже, что вы пытаетесь сделать список столбцов, разделенных запятыми. но вы говорите, что хотите передать переменную таблицы. В любом случае проблема явно здесь -> 'DECLARE @ TEMP1 NVARCHAR (MAX) = 'SELECT colsUnpivot FROM # TEMP'' Я считаю, что вы хотите @ TEMP1 (имя хорошей переменной!), Чтобы удерживать список столбцов, а не строку выбора. – Hogan

+0

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

ответ

0

Попробуйте

DECLARE @colList VARCHAR(MAX) 

SELECT @colList = 
    Stuff((
    Select ', ' + C.COLUMN_NAME 
    From INFORMATION_SCHEMA.COLUMNS As C 
    Where C.TABLE_SCHEMA = T.TABLE_SCHEMA 
     And C.TABLE_NAME = T.TABLE_NAME 
    Order By C.ORDINAL_POSITION 
    For Xml Path('') 
), 1, 2, '') 
From INFORMATION_SCHEMA.TABLES As T 
WHERE TABLE_NAME = @Table_Name 
GROUP BY TABLE_NAME 

, а затем использовать @colList вместо @TEMP1

Вам не нужно временную таблицу или любого другого безумия.

(нб - я получил код колонки здесь https://stackoverflow.com/a/4936669/215752)

+0

но это не работает, и поэтому я попросил его выполнить. Вот ошибка, Msg 156, Level 15, State 1, Line 16 Неверный синтаксис рядом с ключевым словом 'FROM'. Msg 156, Level 15, State 1, Line 21 Неверный синтаксис рядом с ключевым словом «ORDER». – nick

+0

@nick --- ok Я нашел для вас какой-то рабочий код. – Hogan

+0

Большое спасибо @Hogan. – nick