0

我有一个 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 上创建了一个用户定义的表类型,它看起来像第二个表。

然后我开始写程序...

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 可以使用变量作为输入或作为输出......但我不确定是否可以将此用户定义的表类型放入此过程中......

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

非常感谢您

4

1 回答 1

4

您是否考虑过对数据进行 PIVOT?类似于以下内容:

SELECT
    [Firstname]
  , [Lastname]
  , [Birthday]
FROM
    (
        SELECT
            [DataRecordset]
          , [DataField]
          , [DataValue]
        FROM [Table]
    ) DATA
    PIVOT
    (
        MIN ([DataValue]) FOR [DataField] IN
        (
            [Firstname]
          , [Lastname]
          , [Birthday]
        )
    ) PVT
于 2013-02-27T13:36:50.360 回答