Sql 基于其他表行动态选择表和列

Sql 基于其他表行动态选择表和列,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有以下表格和数值 Tb_name column_name1 column_name2 Citator_KTLO_CC Date_Created Date_Modified Citator_KTLO_QA Date_Created Date_Modified 我想从表中动态选择列,结果如下: Select Date_Created,Date_Modified from Citator_KTLO_CC 在下一个循环中,它将选择第二行,如 Select Date

我有以下表格和数值

Tb_name         column_name1    column_name2
Citator_KTLO_CC Date_Created    Date_Modified
Citator_KTLO_QA Date_Created    Date_Modified
我想从表中动态选择列,结果如下:

Select Date_Created,Date_Modified from Citator_KTLO_CC
在下一个循环中,它将选择第二行,如

Select Date_Created,Date_Modified from Citator_KTLO_QA
如何使用动态sql实现这一点

任何例子都值得欣赏。

试试这个。。
DECLARE @SQL VARCHAR(1000); 

SET @SQL = '

SELECT  *
FROM    Citator_KTLO_CC
UNION ALL
SELECT  *
FROM    Citator_KTLO_QA;'

EXEC (@SQL);
用于在aloop中运行时选择一行

DECLARE @sql NVARCHAR(4000)
SELECT @sql = ' select ' + column_name_1 + ',' + column_name2 + ' from ' + Tb_name
FROM < yourtable >
EXEC (@sql)
DECLARE@sql-NVARCHAR(4000)
选择@sql='从'+Tb\u name'中选择'+column\u name\u 1+','+column\u name 2+'
从
EXEC(@sql)

DECLARE@sql-NVARCHAR(4000)
选择@sql='union all从'+Tb\u name'中选择'+column\u name_1+','+column\u name 2+'
从
设置@sql=stuff(@sql,1,10,,)
EXEC(@sql)

像这样的东西怎么样。如果有两个以上的col,可以使用动态sql生成col列表,然后生成更动态的sql,而不是硬编码

DROP TABLE #Test

CREATE TABLE #Test 
(Tb_name  NVARCHAR(15),
 column_name1    NVARCHAR(12),
 column_name2 NVARCHAR(13));

 INSERT INTO #Test VALUES
('Citator_KTLO_CC','Date_Created','Date_Modified'),
('Citator_KTLO_QA','Date_Created','Date_Modified');

DECLARE @SQL  NVARCHAR(MAX)

SET @SQL = (SELECT STUFF((SELECT ' UNION ALL SELECT ' + Cols + ' FROM '+TbL 
 FROM (SELECT QUOTENAME(Tb_name) TBL,
      QUOTENAME(column_name1) + ', '+
      QUOTENAME(column_name2) Cols
      FROM #Test) Blah
 FOR XML PATH('')),1,10,''))

 PRINT @SQL

EXEC sys.sp_executesql @SQL

下面是一个如何执行此操作的示例。
因为你没有发布太多的信息,所以我假设包含所有表名的表叫做“tables”

此外,这仅在所有表都具有相同的列类型时才起作用

-- create a test table you dont need this
create table tables (tb_name varchar(100) primary key, field1 varchar(100), field2 varchar(100))

-- fill my test table you dont need this
insert into tables values ('table1', 'field1', 'field2')
insert into tables values ('table2', 'foo1', 'foo2')
insert into tables values ('table3', 'test1', 'test2')

-- this is the actual code you need, replace the names with your real names
declare @sql varchar(max) = ''
declare @tb_name varchar(100) = ''
declare @field1 varchar(100) = ''
declare @field2 varchar(100) = ''

declare myCursor cursor for
  select tb_name, field1, field2 from tables -- dont know how your table is called

open myCursor
fetch next from myCursor into @tb_name, @field1, @field2
while @@FETCH_STATUS = 0
begin
  set @sql = @sql + ' select ' + @field1 + ', ' + @field2 + ' from ' +  @tb_name + ' union all '
  fetch next from myCursor into @tb_name, @field1, @field2
end
close myCursor
deallocate myCursor 

select @sql = left(@sql, len(@sql) - 10) 

exec (@sql)
编辑: 使用where子句是可能的,但事情会变得更复杂

declare @something date = getdate()

set @sql = @sql + ' select ' + @field1 + ', ' + @field2 + ' from ' +  @tb_name + ' where ' + @field1 + ' = ' + @something + ' union all '
您可以使用上面的示例来构建所需的内容,只需使用它即可

编辑: 使用带有日期格式的where子句

declare @something date = getdate()

set @sql = @sql + ' select ' + @field1 + ', ' + @field2 + ' from ' +  @tb_name + ' where ' + @field1 + ' = ''' + CONVERT(varchar(8), @something, 112) + ''' union all '

你能发布两个表的示例数据和一个结果集应该是什么样子的示例吗?如果你希望有人帮助你,你就必须弄清楚你需要什么。我们还能为您提供什么帮助?有没有hibernate方法可以做到这一点?还有,当您发现它有帮助时,您可以给我一个更新的答案。在这里工作,您可以用以下内容替换行exec(@sql):select convert(varchar(2000),@sql)然后把结果贴在这里?是的,我知道了..Thankshow我能用上面问题中的where条件吗?我用一个例子编辑了我的答案,你必须做一些游戏,但这应该会让你上路
declare @something date = getdate()

set @sql = @sql + ' select ' + @field1 + ', ' + @field2 + ' from ' +  @tb_name + ' where ' + @field1 + ' = ' + @something + ' union all '
declare @something date = getdate()

set @sql = @sql + ' select ' + @field1 + ', ' + @field2 + ' from ' +  @tb_name + ' where ' + @field1 + ' = ''' + CONVERT(varchar(8), @something, 112) + ''' union all '