繁体   English   中英

MSSQL INFORMATION_SCHEMA.COLUMNS 成表,然后在 SELECT 语句中使用

[英]MSSQL INFORMATION_SCHEMA.COLUMNS into a table, then use in a SELECT statement

有一个真正的益智游戏打乱了我的想法,有人可以帮忙吗?

我将所有表列名放入一个表中,并按模板名称对列名进行分组。

这个想法是我可以选择 template_1 并且只有那些列名出现在 Select 语句中,例如

-- 模板表 -- -- table1 -

firstname, template_A
lastname, template_A
field3, template_B
location, template_A

似乎如果您从表字段(字符串值)中提取列名,则可以将其 SELECT 作为列。

困难之处在于,由于我有不同的模板,我需要选择正确的模板,然后让这些字段为值调用第二个表,例如

-- 数据表 -- -- table2 -

firstname, lastname, location
David, Smith, Glasgow

-- 数据参考模板 -- -- table3 -

table1_field1_id, table2_field1_id

我尝试先创建一个变量然后运行 ​​SQL,例如

SET @COLS = 'SELECT t1.field, (SELECT ' + t1.field + ' FROM t2)
FROM table1 t1
INNER JOIN table3 t3 ON t1.field1_id = t3.field1_id
INNER JOIN table2 t2 ON t2.field1_id = t3.field1_id
WHERE t1.template = 'template_A'

EXEC SP_EXECUTESQL @COLS

我正在尝试获得类似的输出...

firstname, David
lastname, Smith
location, Glasgow

困难的部分是不同的模板需要加载不同的列

这里的任何解决方案都很难压缩成单个语句,并且避免某种循环结构也将非常困难。 这是一个涉及游标的解决方案。

顺便说一句,使用这样的方法, table3是多余的。 至少,我最终不需要它。

-- BEGIN TEST DATA

create table table1 (field varchar(max), template varchar(max))
insert into table1 select 'firstname', 'template_A'
insert into table1 select 'lastname', 'template_A'
insert into table1 select 'field3', 'template_B'
insert into table1 select 'location', 'template_A'

create table table2 (firstname varchar(max), lastname varchar(max), location varchar(max))
insert into table2 select 'David', 'Smith', 'Glasgow'
insert into table2 select 'John', 'Hancock', 'Dublin'

-- END TEST DATA

declare @sql nvarchar(max)                     -- Used with sp_executesql
declare @field varchar(max)                    -- Temp variable for cursor
declare @template varchar(max) = 'template_A'  -- Set template name here

-- Temp table for output
create table #tmp (field varchar(max), value varchar(max))

-- BEGIN CURSOR

declare template_assignment cursor for 
select field from table1 where template = @template

open template_assignment  
fetch next from template_assignment into @field  

while @@fetch_status = 0  
begin  
    set @sql = 'insert into #tmp (value) select ' + @field + ' from table2'

    exec sp_executesql @sql

    update #tmp set field = @field where field is null

    fetch next from template_assignment into @field 
end 

close template_assignment  
deallocate template_assignment

-- END CURSOR

select * from #tmp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM