我有一个SQL-Table,eache行包含一个singel某种Virtuel-Tabel的值 - 意味着真正的existig SQL-Table看起来像这样:
-----------------------------------------
|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-Table与第一个存储的原因是,核心数据周围有更多的信息...比如写数据的人......数据是什么时候写的..从哪个时间到数据显着...所以有很多不同的变量,它决定了第一个表中哪一行用来生成第二个。
我在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 ...但是如果它可以将此用户定义的表类型放入此过程中,那么我并不是真的......
有人知道如何运行此代码吗?
非常感谢
答案 0 :(得分:4)
您是否考虑过对数据进行PIVOT?有点像:
SELECT
[Firstname]
, [Lastname]
, [Birthday]
FROM
(
SELECT
[DataRecordset]
, [DataField]
, [DataValue]
FROM [Table]
) DATA
PIVOT
(
MIN ([DataValue]) FOR [DataField] IN
(
[Firstname]
, [Lastname]
, [Birthday]
)
) PVT