DETAILS表有以下列
Title First Second Third Fourth Fifth
------------------------------------------
A null null null null null
input variable
--------------
@columns = 'Title, Third, Fourth'
我想将输出生成为
@allcolumns = 'Title, Third, Fourth, First, Second, Fifth'
变量@allcolumns将包含来自DETAILS表的所有列,但首先是@columns,然后是其余的列
例如,如果
@columns = 'Title, Fourth,Fifth'
然后输出
@allcolumns = 'Title, Fourth, Fifth, First, Second, Third'
由于
答案 0 :(得分:3)
这应该有效:
DECLARE @columns VARCHAR(max);
DECLARE @allcolumns VARCHAR(max);
SET @columns = 'Title,Fourth,Fifth';
SET @allcolumns = @columns;
SELECT @allcolumns = @allcolumns + ',' + column_name FROM
INFORMATION_SCHEMA.columns WHERE
table_name = 'DETAILS' AND
CHARINDEX(column_name, @columns) = 0;
SELECT @allcolumns;
GO
另外一个想法:如果你想创建一个SELECT语句来选择上面代码生成的顺序中的列,你可以这样做:
DECLARE @sql VARCHAR(max);
SET @sql = 'SELECT ' + @allcolumns + ' FROM DETAILS';
EXEC(@sql);
......虽然我不明白你为什么要那样做。
答案 1 :(得分:0)
有很多方法可以做到这一点。作为您的问题相当普遍,如果使用SQL Server,我建议您查看以下链接并使用INFORMATION_SCHEMA视图。
http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/
答案 2 :(得分:0)
首先也是最重要的是,为什么不简单地返回第一到第五列,让调用代码确定要使用哪些列?通常,SQL语言不是为动态列确定和生成而设计的。它假设调用代码处理应该返回的列的确定。此外,调用代码永远不会依赖于查询中的列顺序,因此输出中列的顺序应该没有区别。鉴于此,您应该在中间层组件或报告工具中执行此类操作。
其次,虽然可能在T-SQL中解决这类问题,但不应该这样做。 T-SQL对字符串操作很糟糕。
最后,如果您需要构建这种类型的查询以从数据库模式中获取正确的信息,则可能需要重新评估数据库模式。当您开始遇到越来越复杂的查询以检索所需的信息时,它表明模式与业务需求脱节。