动态SQL - 从临时表中选择值

3
我有一个临时表格,其中包含以下信息。

表名 列名 主键列名 主键(GUID)

(共4列)
我需要再添加一列Value,该列应该根据以下条件抓取数据: “对于临时表中的每一行”
select ColumnName from  TableName  where PrimaryKeyColumnName  = Primarykey  

更准确地说,查询必须直接从表中检索值。

我确定可以使用游标来实现这一点,但可能会影响我的查询性能。 是否可以使用sp_sqlexecute来实现?我尝试将查询转换为varchar

像这样

set @sql = 'select '+ #final.[primary field] +'from ' + #final.tablename +
                'where '+ #final.PrimaryKeyColumnName  + '='+ #final.Primarykey  

exec sp_sqlexecute  @sql
3个回答

1
可能这对你有帮助 -
IF OBJECT_ID('tempdb.dbo.#temp') IS NOT NULL
    DROP TABLE #temp
GO

CREATE TABLE #temp
(
    [primary field] SYSNAME,
    tablename SYSNAME,
    PrimaryKeyColumnName SYSNAME,
    Primarykey SYSNAME
)

INSERT INTO #temp ([primary field], tablename, PrimaryKeyColumnName, Primarykey) 
VALUES 
    ('[column1]','[table1]','[column3]', '[column12]'), 
    ('[column2]','[table2]','[column4]', '[column24]')


DECLARE @SQL NVARCHAR(MAX)
SET @SQL = (
    SELECT CHAR(13) + 'SELECT '+ [primary field] + ' FROM ' + tablename +
        ' WHERE '+ PrimaryKeyColumnName  + ' = '+ Primarykey 
    FROM #temp
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')

PRINT @SQL
--EXEC sys.sp_executesql @SQL

输出 -

SELECT [column1] FROM [table1] WHERE [column3] = [column12]
SELECT [column2] FROM [table2] WHERE [column4] = [column24]

非常感谢。这正是我所期望的。我担心我的问题不够清晰,难以理解。你救了我一命。 - vikram
我该如何将值更新到主表中呢?例如,更新#final集合中的@somecolumnname= exec sys.sp_executesql @SQL。 - vikram
你能提供一个小例子吗? - Devart
嗨,请查看我上面发布的示例。 - vikram

0

我不确定我理解你想做什么,但是可以试试这个:

declare @sql varchar(8000);
set @sql = null;
select @sql = 
coalesce(@sql+' union all select '+ColumnName+' from '+ tablename,  
'select '+ColumnName+' from '+ tablename) 
from final where ColumnName = PrimaryKeyColumnName;
exec sp_sqlexecute @sql;       

请注意,@sql是有限制的 - 在我的示例中为8000 - 如果你拥有的临时表太大,你就需要进行分离执行,并对代码进行一些更改。 始终要将@SQL的初始值设置为null。 我认为不需要游标,这个问题可以使用一些SQL技巧来解决。 希望这能帮到你...

0

创建临时表 #tempValueFetch

(

TableName sysname,
PrimaryKeyColumnName sysname,
AttributeColumnName sysname,
Primaryfield sysname,
PrimaryKey sysname,
Label nvarchar(max),
Value nvarchar(max)

)

这个临时表已经填充了5列,分别是TableName、PrimaryKeyColumnName、AttributeColumnName、Primaryfield和PrimaryKey。

标签和值必须动态更新。请注意,主键是唯一标识符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接