t-sql string&表列操作

时间:2010-06-19 05:40:04

标签: sql sql-server tsql sql-server-2008

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'

由于

3 个答案:

答案 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对字符串操作很糟糕。

最后,如果您需要构建这种类型的查询以从数据库模式中获取正确的信息,则可能需要重新评估数据库模式。当您开始遇到越来越复杂的查询以检索所需的信息时,它表明模式与业务需求脱节。