Хранимая процедура SQL Server создает таблицу с динамическим номером столбца - PullRequest
0 голосов
/ 03 февраля 2012

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

Я использую Microsoft SQL Server 2008.

У меня есть следующий запрос, который предназначен для хранения данных, переданных из источника XML, в таблицу, которая должна быть создана с помощью этой хранимой процедуры.

CREATE PROCEDURE AddClaimData_newV2
    @xml_text VARCHAR(4000),
    @devYearColumnNumber INT
AS

  DECLARE @i INT
  DECLARE @tempTable TABLE (
       ProductName       VARCHAR(50), 
       Year              INT, 
       Value1            FLOAT , 
       Value2            FLOAT , 
       Value3            FLOAT , 
       Value4            FLOAT )

  EXEC sp_xml_preparedocument @i OUTPUT, @xml_text 

  INSERT INTO @tempTable
    SELECT * FROM 
      OPENXML(@i, '/root/Product/Year/Value1/Value2/Value3/Value4', 1) 
      WITH 
        (ProductName    VARCHAR(50) '../../../../../@Name', 
         Year     INT  '../../../../@Year', 
         Value1   FLOAT  '../../../@Value', 
         Value2   FLOAT  '../../@Value',
         Value3   FLOAT  '../@Value',
         Value4   FLOAT  '@Value')

/* create a new table and store all the data from @tempTable */

EXEC sp_xml_removedocument @i

По сути, ProductName и Year являются фиксированными столбцами, но столбцы Value[i] определяются параметром devYearColumnNumber.

Мои вопросы:

  1. как использовать параметр для динамического создания этих Value[i] столбцов
  2. затем, как создать новую таблицу с этими столбцами для хранения данных с @tempTable

1 Ответ

1 голос
/ 23 мая 2013
declare @currentColumnNumber int, @sqlCommandToCreateTable nvarchar(4000)
set @currentColumnNumber = 1
set @sqlCommandToCreateTable = 'CREATE TABLE testClaimData (
        ProductName       VARCHAR(50),
        Year              INT '
while @currentColumnNumber <= @devYearColumnNumber
begin
    set @sqlCommandToCreateTable = @sqlCommandToCreateTable + ' , 
        Value' + convert(varchar, @currentColumnNumber) + '            FLOAT'
    set @currentColumnNumber = @currentColumnNumber + 1
end
set @sqlCommandToCreateTable = @sqlCommandToCreateTable + ' )'
exec sp_executeSql @sqlCommandToCreateTable

--[Test this with:]-- exec sp_executeSql N'select * from testClaimData'

--similar mechanism for the "INSERT INTO" here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...