SQL结果为带有通配符的字符串

时间:2012-05-23 14:44:41

标签: sql sql-server

假设您有一个这样的表:

ID     FNAME      LNAME
1      Bob        Smith
2      Sally      Jones

一个简单的SELECT * FROM [Table]将返回所有行。但是,如果您想从结果中构建单个字符串,并且列名称未知,该怎么办?换句话说,这不起作用:

SELECT ID + ',' + FNAME + ',' + LNAME FROM [Table]

因为您不知道列名。此外,COALESCE不会工作,因为它不接受通配符。理想情况下,您希望执行以下内容:

SELECT dbo.FunctionThatSplitsResultsToString(*) FROM [Table]

并让它返回

1,Bob,Smith
2,Sally,Jones

这可能吗?

3 个答案:

答案 0 :(得分:2)

这是@Igor给出的答案的更正版本。除了在值之间连接逗号字符外,它还将NULL值转换为空字符串(因为将字符串连接到NULL会导致NULL值)。

DECLARE @sql NVARCHAR(max)='SELECT '
DECLARE @TableName NVARCHAR(max) = 'Table_Name' -- <-- Set the target table name here

SELECT @sql=@sql+N'ISNULL(CAST(' + name +' as NVARCHAR(max)), '''')+'',''+'
FROM sys.columns
WHERE object_id=OBJECT_ID(@TableName)

SELECT @sql=SUBSTRING(@sql,1,LEN(@sql)-5)+N' FROM ' + @TableName
--SELECT @sql -- uncomment to see the query string

EXEC sp_executesql @sql

答案 1 :(得分:1)

正如第一个Igor所说,解决方案是动态SQL。您需要正确构造基础SQL语句。

以下代码将所有列强制转换为varchar(),然后将它们连接在一起。 SQL的最终形式删除最后一个“+”符号并添加from语句:

declare @sql varchar(max);

select @sql = (select 'cast('+coalesce(column_name, '') + ' as varchar(255)) +'
               from information_schema.columns
               where table_name = <whatever>
               for xml path ('')
              );

select @sql = left(@sql, len(@sql - 2)) + ' from t';

exec(@sql);

我承认以美国为中心,很少使用国际化。整个过程也适用于nvarchars()。

答案 2 :(得分:0)

尝试以下

GO DECLARE @ColumnsList VARCHAR(MAX),@ SelectStatement VARCHAR(MAX),@ TargetTable VARCHAR(250),@ FINALSQL NVARCHAR(MAX) SET @TARGETTABLE ='TempData'

SELECT @ColumnsList = COALESCE(@ ColumnsList +'+'',''+','')+'Cast('+ A.COLUMN_NAME +'AS Varchar(250))' FROM(选择来自INFORMATION_SCHEMA.COLUMNS的Column_Name,其中TABLE_NAME = @TARGETTABLE)A SELECT @FinalSql ='选择'+ @ ColumnsList +'FROM'+ @TARGETTABLE

EXEC SP_EXECUTESQL @FINALSQL GO