用户定义类型的动态“INSERT INTO”查询

时间:2013-02-27 13:30:22

标签: tsql sql-server-2012 user-defined-types dynamicquery sp-executesql

我有一个SQL-Table,eache行包含一个singel某种Virtuel-Tabel的值 - 意味着真正的existig SQL-Table看起来像这样:

-----------------------------------------
|DataRecordset | DataField | DataValue  |
-----------------------------------------
| 1            | Firstname | John       |
| 1            | Lastname  | Smith      |
| 1            | Birthday  | 18.12.1963 |
| 2            | Firstname | Jane       |
| 2            | Lastname  | Smith      |
| 2            | Birthday  | 14.06.1975 |
-----------------------------------------

我需要得到像这样的东西:

-------------------------------------
| Firstname | Lastname | Birthday   |
-------------------------------------
| John      | Smith    | 18.12.1963 |
| Jane      | Smith    | 14.06.1975 |
-------------------------------------

真正存在的SQL-Table与第一个存储的原因是,核心数据周围有更多的信息.​​..比如写数据的人......数据是什么时候写的..从哪个时间到数据显着...所以有很多不同的变量,它决定了第一个表中哪一行用来生成第二个。

我在SQL-Server上创建了一个User-Defined-Tabletype,它看起来像第二个表。

然后我开始写一个程序......

DECLARE @secondTable secondTable_Typ

DECLARE firstTable_Cursor CURSOR FOR SELECT DataRecordset, ... WHERE...lot of Text
OPEN firstTable_Cursor

FETCH NEXT FROM firstTable_Cursor
INTO @DataRecordset, @...

WHILE @@FETCH_STATUS = 0
BEGIN

  IF NOT EXISTS(SELECT * FROM @secondTable WHERE DataRecordset= @DataRecordset)
  BEGIN

我遇到的问题......现在我需要某种动态查询,因为我想做类似的事情:

INSERT INTO @secondTable (DataRecordset, @DataField ) VALUES (@DataRecordset, @DataValue)

但是我不能像这样使用变量@DataField ...所以我用谷歌找到了函数sp_executesql ...我写了下面的代码:

SET @sqlString = 'INSERT INTO @xsecondTable  (DataRecordset, ' + @DataField + ') VALUES (@xDataRecordset, @xDataValue)'
EXEC sp_executesql @sqlString, N'@xsecondTable secondTable_Typ, @xDataRecordset smallint, @xDataValue sql_variant', @secondTable , @DataRecordset, @DataValue

但是当我运行该程序时,我收到一个错误,这意味着我必须将参数“READONLY”添加到“@xsecondTable”......

我认为问题是,sp_executesql可以使用变量作为输入或outup ...但是如果它可以将此用户定义的表类型放入此过程中,那么我并不是真的......

有人知道如何运行此代码吗?

非常感谢

1 个答案:

答案 0 :(得分:4)

您是否考虑过对数据进行PIVOT?有点像:

SELECT
    [Firstname]
  , [Lastname]
  , [Birthday]
FROM
    (
        SELECT
            [DataRecordset]
          , [DataField]
          , [DataValue]
        FROM [Table]
    ) DATA
    PIVOT
    (
        MIN ([DataValue]) FOR [DataField] IN
        (
            [Firstname]
          , [Lastname]
          , [Birthday]
        )
    ) PVT