具有用户定义类型的动态"INSERT INTO"查询



我有一个sql表,每一行包含一个单一的值的某种虚拟表-意味着真实存在的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…所以我用谷歌,发现函数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可以使用变量作为输入或输出…但是我不确定是否有可能将这个用户定义的表类型放入这个过程中…

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

非常感谢

您考虑过对数据进行PIVOT吗?类似以下语句:

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

相关内容

  • 没有找到相关文章

最新更新