0

我有一個SQL-表是eache線由某種Virtuel-TABEL的的辛格運河值查詢 - 意味着真正的existig SQL-表看起來是這樣的:動態「INSERT INTO」與用戶定義類型

----------------------------------------- 
|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可以使用變量作爲輸入或outup ...但我不舒服,如果它的possiple得到這個用戶定義表類型進入這個過程...

有人任何想法如何讓這段代碼運行?

非常感謝你

+0

我知道有些exampels其中用戶定義類tabletypes使用蒙山這個功能......但他們都標有隻讀的,只是做一些SELECT ... – user2111880 2013-02-27 13:35:53

+0

哪些SQL服務器你使用的是哪個版本? – Arion 2013-02-27 13:41:49

+0

我使用SQL-Server版本2012 – user2111880 2013-04-03 08:03:30

回答

4

你有沒有考慮對數據做了PIVOT?沿着線的東西:

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

真棒! - 有用! - 非常感謝:) – user2111880 2013-03-25 08:15:35

+0

快樂,很高興我能幫上忙。 :) – FarligOpptreden 2013-03-25 08:20:26

+0

你好,還有一個額外的問題:是否有機會在決賽桌中添加「DataRecordset」列? - 非常感謝你。 – user2111880 2013-04-03 06:50:20