T-SQL:创建具有灵活结构的临时表/表变量

时间:2014-08-22 09:48:32

标签: sql temp-tables table-variable

我正在开发基于SQL的报告项目,但我限制了对数据库的访问;我只能进行SELECT查询并将我检索的数据插入到临时表/表变量中。我无法创建/执行存储过程或任何类型的函数。

我正在运行的查询旨在将所有工程师和他们拥有的不同关键技能汇集在一起​​,以便我们以后可以看到每个工程师具有哪些技能或哪些工程师属于某种技能。

为此,我试图创建一个具有灵活结构的表变量/临时表,该结构基于先前在同一查询中获得的值。

对于例如

第一输出: 亚当 布拉德 胡里奥 Martinez的

第二输出(以空白分隔的技能): VOIP TTS DBA 交换 服务器

创建临时表/表变量,它将第一个输出用作行,第二个输出用作列,反之亦然。然后,我将根据主DB上的不同值填充此新表。

请告知如何完成此操作,或提供此问题的任何其他解决方案。 谢谢

2 个答案:

答案 0 :(得分:2)

我相信你可以。

首先,您需要根据查询创建具有动态结构的临时表。可以这样做:

声明脚本模板:

  

设置@ScriptTmpl ='更改表#tempTable添加[?] varchar(100);

构建脚本,它将根据查询插入您需要的列:

  

选择@TableScript = @TableScript +替换(@ScriptTmpl,'?',   ColumnName)From ... Where ...

然后执行脚本,然后用第二个查询中的值填充新表

<强> UPD:

这是临时表动态创建的完整示例。我在我的示例中使用了全局临时表:

declare @scriptTemplate nvarchar(MAX)
declare @script nvarchar(MAX)
declare @tableTemplate nvarchar(MAX)

SET @tableTemplate = 'create table ##tmptable (?)'
SET @scriptTemplate = '? nvarchar(500),'
SET @script = ''

Drop table ##tmptable

Select @script = @script + Replace(@scriptTemplate, '?', [Name])
From Account
Where name like 'ES_%'

SET @script = LEFT(@script, LEN(@script) - 1)

SET @script = Replace(@tableTemplate, '?', @script)

Select @script

exec(@script)

Select * from ##tmptable

答案 1 :(得分:0)

首先,您可以通过pivots而不是临时表来实现您想要的效果。

其次,如果你真的想要创建一个包含列名&#34; Adam Brad&#34;的表,那么解决方案是dynamic SQL,根据你的权限你可能无法做到。