0

假设你有一个这样的表:

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

这可能吗?

4

3 回答 3

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
于 2012-05-23T16:35:41.263 回答
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()。

于 2012-05-23T16:00:42.913 回答
0

试试下面的

去声明@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 = 'Select ' +@ColumnsList + ' FROM ' + @TARGETTABLE

执行 SP_EXECUTESQL @FINALSQL GO

于 2012-05-23T16:59:50.503 回答