假设您有一个这样的表:
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
这可能吗?
答案 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