sql - SQL Server:从@variable_table_name 中选择(嵌套变量的问题)
问题描述
我需要选择一个变量表名,这在 SQL Server 中似乎不起作用(参见示例 nr 2)。
我尝试做一个中间步骤,用我的变量表名作为静态文本创建一个字符串(参见示例 nr3),但这也失败了,可能是因为我有嵌套变量。
任何人都可以帮我解决它吗?
------------Example Nr 1--------------
-- Working query without variable Table
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = 'SELECT ';
SELECT @Sql = @Sql +'['+[Modell Pset (S1 Slab)]+']'+ ' AS ''' +''+[C3D Pset (S1 Slab)]+''', ' FROM [MTO_Psets_S1_Slab]
PRINT @sql
--Result of "print @sql": SELECT [c3d:abschnitt] AS 'Abschnitt', [ALL] AS 'Eigenschaft_1', [ALL] AS 'Eigenschaft_2', [Geschoss] AS 'Geschoss', [ALL] AS 'Ist_Aussen', [ALL] AS 'Material_1', [ALL] AS 'Material_2', [ALL] AS 'Objekt', [c3d:teilprojekt] AS 'Teilprojekt',
SET @Sql = (SELECT LEFT(@Sql, LEN(@Sql)-1));
SET @Sql = @Sql + ' FROM [modell_properties_slab]';
EXEC sp_executesql @Sql;
------------Example Nr 2--------------
-- When I replace table with a variable, the query doesn't work anymore
DECLARE @Sql NVARCHAR(MAX);
DECLARE @Table NVARCHAR(MAX);
SET @table = '[MTO_Psets_S1_Slab]'
SET @Sql = 'SELECT ';
SELECT @Sql = @Sql +'['+[Modell Pset (S1 Slab)]+']'+ ' AS ''' +''+[C3D Pset (S1 Slab)]+''', ' FROM @table
SET @Sql = (SELECT LEFT(@Sql, LEN(@Sql)-1));
SET @Sql = @Sql + ' FROM [modell_properties_slab]';
EXEC sp_executesql @Sql
-- Error message:
-- Msg 1087, Level 16, State 1, Line 24
-- Must declare the table variable "@Table".
------------Example Nr 3--------------
-- When I rewrite the query to have the table inside the apostrophes,
-- it doesn't work (compare the result of "print @sql" with the example nr1)
declare @slab nvarchar(MAX) ='slab'
DECLARE @intermediate_step nvarchar(MAX);
set @intermediate_step = '''[''[Modell Pset (S1 Slab)]+'']''+ '' AS '''''' +''''+[C3D Pset (S1 Slab)]+'''''', '' FROM [MTO_Psets_S1_'+@Slab+']'
print @intermediate_step
--Result of "print @intermediate_step": '['[Modell Pset (S1 Slab)]+']'+ ' AS ''' +''+[C3D Pset (S1 Slab)]+''', ' FROM [MTO_Psets_S1_slab]
DECLARE @Sql nvarchar(MAX);
SET @Sql = 'SELECT ';
SELECT @Sql = @Sql + @intermediate_step
print @sql
--Result of "print @sql": SELECT '['[Modell Pset (S1 Slab)]+']'+ ' AS ''' +''+[C3D Pset (S1 Slab)]+''', ' FROM [MTO_Psets_S1_slab]
SET @Sql = (SELECT LEFT(@Sql, LEN(@Sql)-1));
SET @Sql = @Sql + ' FROM [modell_properties_slab]';
EXEC sp_executesql @Sql;
我将在查询中使用的表和工作查询“example nr 1”中的结果表附加为 JPG:MTO_Psets_S1_Slab、modell_properties_slab、结果查询
MTO_Psets_S1_Slab modell_properties_slab 结果查询
解决方案
我像这样重写了查询,它可以工作:
exec('
declare @t as table ([C3D Pset (S1 '+@slab+')] nvarchar (100), [Modell Pset (S1 '+@slab+')] nvarchar (100));
DECLARE @Sql nvarchar(MAX);
insert @t ([C3D Pset (S1 '+@slab+')] , [Modell Pset (S1 '+@slab+')] )
select * from [MTO_Psets_S1_'+@slab+']
SET @Sql = ''SELECT '';
SELECT @Sql = @Sql +''[''+[Modell Pset (S1 Slab)]+'']''+ '' AS '''''' +''''+[C3D Pset (S1 Slab)]+'''''', '' FROM @t
SET @Sql = (SELECT LEFT(@Sql, LEN(@Sql)-1));
SET @Sql = @Sql + '' FROM [modell_properties_'+@slab+']'';
EXEC sp_executesql @Sql
')
推荐阅读
- javascript - 是否可以使用javascript获取mac地址?
- javascript - 角度文件上传 SyntaxError:位置 1 的 JSON 中的意外数字
- blogdown - blogdown 如何导入之前构建的 Rmd 文件
- c# - 如何在 C# 中使用 linq 动态添加列表中的多个项目
- php - 两张桌子并排
- angular - Angular 8:从本地存储读取,修改并保存回同一个文件
- c# - 保存的搜索以编程方式不返回任何结果
- powerbi - 与外部用户共享工作区、报告和应用程序
- node.js - 如何在nodejs中返回一个带有“for”循环和异步的数组?
- r - 具有不同的 .RMD 文件和输出文件名