Tsql “动态”;在“;用户定义类型的查询

Tsql “动态”;在“;用户定义类型的查询,tsql,sql-server-2012,user-defined-types,dynamicquery,sp-executesql,Tsql,Sql Server 2012,User Defined Types,Dynamicquery,Sp Executesql,我得到了一个SQL表,每一行都由某种Virtuel Tabel的单个值组成,这意味着实际存在的SQL表如下所示: ----------------------------------------- |DataRecordset | DataField | DataValue | ----------------------------------------- | 1 | Firstname | John | | 1 | Lastname

我得到了一个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 |
-------------------------------------
INSERT INTO @secondTable (DataRecordset, @DataField ) VALUES (@DataRecordset, @DataValue)
我需要有这样的感觉:

-----------------------------------------
|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 |
-------------------------------------
INSERT INTO @secondTable (DataRecordset, @DataField ) VALUES (@DataRecordset, @DataValue)
真实的现有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
我的问题是。。。现在我需要某种动态查询,因为我想做如下操作:

-----------------------------------------
|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 |
-------------------------------------
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可以使用变量作为输入或输出。。。但我不是舒尔,如果有可能将此用户定义的表格类型引入此过程

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
有人知道如何运行这个代码吗


非常感谢

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

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

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

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

我知道一些例子,其中用户定义的表类型用于此函数。。。但它们被标记为只读,只需进行一些选择…您使用的是什么sql server版本?我使用的是sql server 2012版我知道一些示例,其中用户定义的表类型用于此函数。。。但它们被标记为只读,只需做一些选择…您使用的是什么sql server版本?我使用的是sql server 2012版本,很高兴能提供帮助。:)您好,还有一个小问题:是否有机会在最后一个表中添加“DataRecordset”列非常感谢。很高兴能为您效劳。:)您好,还有一个小问题:是否有机会在最后一个表中添加“DataRecordset”列非常感谢你。