【问题标题】:Dynamic "INSERT INTO" Query with User Defined Type具有用户定义类型的动态“INSERT INTO”查询
【发布时间】:2013-02-27 13:30:22
【问题描述】:

我有一个 SQL 表,每行包含某种 Virtuel-Tabel 的单个值 - 表示真正存在的 SQL 表如下所示:

-----------------------------------------
|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 表之所以像第一个那样存储,是因为核心数据周围有更多信息......比如谁写了数据......什么时候写的数据...... .从哪个时间到哪个时间数据显着...所以有很多不同的变量决定我使用第一个表中的哪一行来生成第二个。

我在 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...所以我使用google并找到了函数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 可以使用变量作为输入或作为输出...但我不确定是否可以将此用户定义的表类型放入此过程...

有人知道如何让这段代码运行吗?

非常感谢

【问题讨论】:

  • 我知道一些使用此函数的用户定义表类型的示例......但它们被标记为 READONLY 并且只是做一些选择......
  • 你使用的是什么 sql-server 版本?
  • 我使用 SQL-Server 2012 版

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


【解决方案1】:

您是否考虑过对数据进行 PIVOT?大致如下:

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

【讨论】:

  • 很高兴,很高兴我能帮上忙。 :)
  • 您好,还有一个小问题:是否有机会在决赛桌中添加“DataRecordset”列? - 非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多