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テーブルが最初のテーブルのように格納される理由は、コアデータの周りに多くの情報があるためです...誰がデータを書き込んだか...いつデータが書き込まれたか...データが重要だったのはいつですか...したがって、最初のテーブルのどの行を使用して2番目のテーブルを生成するかを決定するさまざまな変数がたくさんあります。

SQL-Server上に2番目のテーブルのような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

しかし、プロシージャを実行すると、「@xsecondTable」にパラメータ「READONLY」を追加する必要があることを意味するエラーが発生しました。

問題は、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 に答える