1

私は美しく機能するクエリを持っています:

CREATE Procedure BCP_Text_File
(  
    @table varchar(100),  
    @FileName varchar(100)  
)  
AS
    If exists(Select * from information_Schema.tables where table_name=@table)
    Begin
        Declare @str varchar(1000)  
        set @str='Exec Master..xp_Cmdshell ''bcp "Select * from '+db_name()+'..'+@table+'" queryout "'+@FileName+'" -c'''  
        Exec(@str)  
    end
    else
        Select 'The table '+@table+' does not exist in the database'

しかし、私はそこにこれを追加する必要があります:

select column_name 
from information_schema.columns
where table_name = @table
order by ordinal_position

これまでのところ、私は持っています:

   alter Procedure BCP_Text_File
   (  
      @table varchar(100),  
      @FileName varchar(100)  
    )  
    AS 
       If exists(Select * from information_Schema.tables where table_name=@table)
       Begin
           Declare @str varchar(1000)  
           set @str='Exec Master..xp_Cmdshell ''bcp "

           select column_name 
           from information_schema.columns
           where table_name = '+db_name()+'..'+@table+'
           order by ordinal_position

           Select * from '+db_name()+'..'+@table+'" queryout "'+@FileName+'" -c'''  
           Exec(@str)  
       end
       else
           Select 'The table '+@table+' does not exist in the database'

しかし、一重引用符や二重引用符を間違えていると思います。結果のフィールド名が最初の行になるように、この select ステートメントを追加しています。

ヘルプやガイダンスをありがとう。

4

1 に答える 1

3

おそらくこれはあなたが望むものですか?これは、(a) 列名にコンマが含まれておらず、(b) 各列の出力が暗黙的に文字列に変換されても問題ないことを前提としています。

ALTER PROCEDURE dbo.BCP_Text_File
    @table    NVARCHAR(255),  
    @filename VARCHAR(100)  
AS
BEGIN
  SET NOCOUNT ON;

  IF OBJECT_ID(@table) IS NOT NULL
  BEGIN
    DECLARE 
        @sql NVARCHAR(MAX), 
        @cols NVARCHAR(MAX) = N'';

    SELECT @cols += ',' + name
      FROM sys.columns
      WHERE [object_id] = OBJECT_ID(@table)
      ORDER BY column_id;

    SELECT @cols = STUFF(@cols, 1, 1, '');

    SET @sql = N'EXEC master..xp_cmdshell ''bcp "SELECT ''''' 
        + REPLACE(@cols, ',', ''''',''''') + ''''' UNION ALL SELECT ' 
        + 'RTRIM(' + REPLACE(@cols, ',', '),RTRIM(') + ') FROM ' 
        + DB_NAME() + '..' + @table + '" queryout "' + @filename + '" -c''';  
    
    EXEC sp_executesql @sql;
  END
  ELSE
  BEGIN
    SELECT 'The table '+@table+' does not exist in the database';
  END
END
GO

しかし、この質問やその他の質問について他の人から得たアドバイスには同意する必要があります。このアプローチは非常に脆弱です。あなたはスチームローラーでピスタチオを割ろうとしています。

PS への参照を削除しました。これは、カタログ ビューの方が信頼性が高く、一貫性があるINFORMATION_SCHEMAと思うからです。

于 2012-06-13T22:51:34.727 に答える