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

以下のものを試してください

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(select Column_Name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TARGETTABLE)A SELECT @FinalSql ='Select' + @ ColumnsList +'FROM' + @TARGETTABLE

EXEC SP_EXECUTESQL @FINALSQL GO

于 2012-05-23T16:59:50.503 に答える