【发布时间】:2013-02-27 13:30:22
【问题描述】:
我有一个 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 上创建了一个 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...所以我使用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 可以使用变量作为输入或作为输出...但我不确定是否可以将此用户定义的表类型放入此过程...
有人知道如何让这段代码运行吗?
非常感谢
【问题讨论】:
-
我知道一些使用此函数的用户定义表类型的示例......但它们被标记为 READONLY 并且只是做一些选择......
-
你使用的是什么 sql-server 版本?
-
我使用 SQL-Server 2012 版
标签: tsql sql-server-2012 user-defined-types dynamicquery sp-executesql