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 '