2010-06-19 68 views
1

详细信息表有以下几列吨-SQL字符串与表列操作

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将包含详细信息表但@columns所有列首先,然后是其余列

因此,例如,如果

@columns = 'Title, Fourth,Fifth' 

然后输出将是

@allcolumns = 'Title, Fourth, Fifth, First, Second, Third' 

感谢

+0

@column是否包含列的名称或值不应该被置于@allcolumn的值? – Dewfy 2010-06-19 06:21:48

回答

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); 

...虽然我看不出为什么你想这样做。

+0

这可以用在临时表上吗? DETAILS表是一个临时表。我试过了,但没有奏效。它基本上返回了@columns。我猜测临时表可能没有information_schema中的详细信息。任何建议? – stackoverflowuser 2010-06-19 06:59:02

+0

我使用了相同的查询,并将其调整为临时表。有用。非常感谢。 – stackoverflowuser 2010-06-19 07:14:56

+0

对不起,我是另外订婚。我没有用临时表来尝试它。你为了使它与临时表一起工作而改变了什么?这些信息可能对其他人有用。 – Mike 2010-06-19 07:24:43

0

首先,也是最重要的是,为什么不干脆第一至第五返回列,让调用代码确定要使用的列?一般的SQL语言不是为动态列确定和生成而设计的。它假设调用代码处理应该返回的列的确定。此外,调用代码从不依赖查询中的列顺序,因此输出中列的顺序应该没有区别。鉴于此,您应该在中间层组件或报告工具中进行这种类型的操作。

其次,虽然它是可能的为了解决T-SQL中的这类问题,不应该这样做。 T-SQL对字符串操作很糟糕。

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