6

次のようなパターンを選択する必要があります。

 SELECT '<text> ' + tbl.* + ' </text>' FROM table tbl;

理想的なソリューションでは、すべての列をコンマで区切って出力します。

2つの列を持つ表1のSQL結果:

'<text>col1, col2</text>'

3つの列を持つ表2のSQL結果:

'<text>col1, col2, col3</text>' 

CONCAT(...)私はこのような関数を使おうとしました:

SELECT CONCAT('<text>', tbl.*, '</text>')
FROM table2 tbl

しかし、列の数が可変であるため、それほど単純ではないことを理解しています。

その問題に対処するための簡単な解決策はありますか?

SQL Server2008R2を使用しています。

4

5 に答える 5

12

特定のテーブル名の任意の数の列; 列名をラップする必要がある場合<text>

DECLARE @s VARCHAR(500)

SELECT @s =  ISNULL(@s+', ','') + c.name   
FROM  sys.all_columns c join sys.tables  t 
            ON  c.object_id = t.object_id
WHERE t.name = 'YourTableName'

SELECT '<text>' + @s + '</text>'

SQLフィドルの例はこちら

-- RESULTS 
<text>col1, col2, col3,...</text>

thenでラップされたクエリ結果セットを選択する必要がある場合。<text>

SELECT @S =  ISNULL( @S+ ')' +'+'',''+ ','') + 'convert(varchar(50), ' + c.name    FROM 
       sys.all_columns c join sys.tables  t 
       ON  c.object_id = t.object_id
WHERE t.name = 'YourTableName'


EXEC( 'SELECT ''<text>''+' + @s + ')+' + '''</text>'' FROM YourTableName')

SQLフィドルの例はこちら

--RESULTS
<text>c1r1,c2r1,c3r1,...</text>
<text>c1r2,c2r2,c3r2,...</text>
<text>c1r3,c2r3,c3r3,...</text>
于 2012-12-07T10:42:24.270 に答える
4

SQL フィドル

MS SQL Server 2008 スキーマのセットアップ:

create table YourTable
(
  ID int identity primary key,
  Name varchar(50),
)

insert into YourTable values
('Name 1'),
('Name 2'),
('Name 3'),
('Name 4'),
('Name 5')

クエリ 1 :

select (
       select (
              select ', '+T2.N.value('./text()[1]',  'varchar(max)')
              from (
                   select T.*
                   for xml path(''), type
                   ) as T1(N)
                cross apply T1.N.nodes('/*') as T2(N)
              for xml path(''), type
              ).value('substring(./text()[1], 3)',  'varchar(max)')
       for xml path('text'), type
       )
from YourTable as T

結果

|               COLUMN_0 |
--------------------------
| <text>1, Name 1</text> |
| <text>2, Name 2</text> |
| <text>3, Name 3</text> |
| <text>4, Name 4</text> |
| <text>5, Name 5</text> |
于 2012-12-07T10:38:29.593 に答える
2

より一般的なアプローチを試みました

Create Procedure P_GetConcatColumns(@tablename varchar(200),@Seperator Varchar(20),@StartTag Varchar(20),@EndTag Varchar(20),@WhereString Varchar(400),@OrderString Varchar(400)) as


DECLARE @TmpTableName VARCHAR(100),
        @Columns NVARCHAR(4000),
        @SQL NVARCHAR(MAX),
        @GENNAME VARCHAR(100)

Select  @GENNAME='##'+Replace(Cast(NewID() as Varchar(40)),'-','')

IF OBJECT_ID('tempdb.dbo.' + @GENNAME) IS NOT NULL
BEGIN
    EXEC('DROP TABLE ' +@GENNAME);
END




Select @SQL='SELECT TOP 1 * INTO '+@GENNAME+' FROM ' + @tablename
Exec (@SQL)



SET @TmpTableName = 'tempdb.dbo.' + @GENNAME
SELECT @Columns = 
    STUFF(
    (
    SELECT '+' + @Seperator + '+CAST(Coalesce(' + c.name + ','''') AS VARCHAR(MAX))' + CHAR(13)
    FROM tempdb.sys.columns c
    WHERE c.[object_id] = object_Id(@TmpTableName)
    FOR XML PATH(''),TYPE
    ).value('.','VARCHAR(MAX)')
    ,1,len(@Seperator)+2,'')

--SET @SQL = N'SELECT ' +''''+ @StartTag +''''+'+'+ @Columns +''''+'+'+ @EndTag + ''' FROM ' + @tablename 
SET @SQL = N'SELECT ''' +@StartTag+ '''+'+ @Columns +'+'''+ @EndTag + ''' FROM ' + @tablename 
+' '+Coalesce(@WhereString,'')
+' '+Coalesce(@OrderString,'')
Print @SQL
EXEC sp_executeSQL @SQL


--ExampleCall P_GetConcatColumns 'Arten',''',''','<test>','</test>','where id>1','Order by ID desc'
于 2012-12-07T11:39:00.127 に答える
-2

IBMDB2: 目的の区切り文字を使用してファイルを作成します。たとえば、delimiter='#|#' を
Step1の下に:-以下のクエリを実行すると、query_to_execute 列に SQL ステートメントが表示されます。

select table_name, 'select '||listagg(column_name, '||''#|#''||')||' from '||trim(table_schema)||'.'||(table_name) as query_to_execute
      from qsys2.SYSCOLUMNS                                  
     where table_name in ('YOURTABLE1', 'YOURTABLE2')                             
       and table_schema = 'YOURSCHEMA'                         
     group by table_schema, table_name

ステップ 2 :-上記のクエリを実行して、SQL で区切られたファイルを取得します。

Step3a (ネイティブ iSeries から SQL を実行している場合):結果をフラット ファイルに移動し、そのフラット ファイルを他のプラットフォームにインポート/FTP_get します。

Step3b (Windows からクエリ ツールを使用して SQL を実行している場合): 結果を任意の file_name.xxx にエクスポートします。

このようにして、選択した区切り文字で CSV または区切りファイルを作成します。

/ニーラジ・クマール

于 2020-08-21T07:57:46.360 に答える