2013-04-18 164 views
12

SQL Serverのストアドプロシージャからcsvファイルを生成することは可能ですか?私は私のストアドプロシージャを作成し、CSVとしていくつかの結果を保存したい、誰かがこれを達成する方法を知っていますか?SQL Serverのストアドプロシージャからcsv出力ファイルを作成する方法

+2

としてキャストされるようになりました実際にプロシージャからcsvファイルを生成するかどうかを検討してください。最初の問題はアクセス許可です.SQL Serverサービスアカウントには出力フォルダへの書き込みが必要なため、問題が発生する可能性があります。 2番目の問題は、通常、データをフォーマット/プレゼンテーションから切り離すことです。プロシージャに結果を生成させてから、外部スクリプトを使用してcsvファイルを生成します。そうすることで、手続きの結果でさまざまなことを行うことができます.csvファイルを生成するのにハードコードされていません。 – Pondlife

答えて

1

このスクリプトは、任意のテーブル構造のための出力ウィンドウにCSV形式に指定されたテーブルから行をエクスポートします。希望、スクリプトがあなたのために参考になります -

DECLARE 
     @TableName SYSNAME 
    , @ObjectID INT 

DECLARE [tables] CURSOR READ_ONLY FAST_FORWARD LOCAL FOR 
    SELECT 
      '[' + s.name + '].[' + t.name + ']' 
     , t.[object_id] 
    FROM (
     SELECT DISTINCT 
       t.[schema_id] 
      , t.[object_id] 
      , t.name 
     FROM sys.objects t WITH (NOWAIT) 
     JOIN sys.partitions p WITH (NOWAIT) ON p.[object_id] = t.[object_id] 
     WHERE p.[rows] > 0 
      AND t.[type] = 'U' 
    ) t 
    JOIN sys.schemas s WITH (NOWAIT) ON t.[schema_id] = s.[schema_id] 
    WHERE t.name IN ('<your table name>') 

OPEN [tables] 

FETCH NEXT FROM [tables] INTO 
     @TableName 
    , @ObjectID 

DECLARE 
     @SQLInsert NVARCHAR(MAX) 
    , @SQLColumns NVARCHAR(MAX) 
    , @SQLTinyColumns NVARCHAR(MAX) 

WHILE @@FETCH_STATUS = 0 BEGIN 

    SELECT 
      @SQLInsert = '' 
     , @SQLColumns = '' 
     , @SQLTinyColumns = '' 

    ;WITH cols AS 
    (
     SELECT 
       c.name 
      , datetype = t.name 
      , c.column_id 
     FROM sys.columns c WITH (NOWAIT) 
     JOIN sys.types t WITH (NOWAIT) ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id 
     WHERE c.[object_id] = @ObjectID 
      AND c.is_computed = 0 
      AND t.name NOT IN ('xml', 'geography', 'geometry', 'hierarchyid') 
    ) 
    SELECT 
      @SQLTinyColumns = STUFF((
      SELECT ', [' + c.name + ']' 
      FROM cols c 
      ORDER BY c.column_id 
      FOR XML PATH, TYPE, ROOT).value('.', 'NVARCHAR(MAX)'), 1, 2, '') 
     , @SQLColumns = STUFF((SELECT CHAR(13) + 
      CASE 
       WHEN c.datetype = 'uniqueidentifier' 
        THEN ' + '';'' + ISNULL('''' + CAST([' + c.name + '] AS VARCHAR(MAX)) + '''', ''NULL'')' 
       WHEN c.datetype IN ('nvarchar', 'varchar', 'nchar', 'char', 'varbinary', 'binary') 
        THEN ' + '';'' + ISNULL('''' + CAST(REPLACE([' + c.name + '], '''', '''''''') AS NVARCHAR(MAX)) + '''', ''NULL'')' 
       WHEN c.datetype = 'datetime' 
        THEN ' + '';'' + ISNULL('''' + CONVERT(VARCHAR, [' + c.name + '], 120) + '''', ''NULL'')' 
       ELSE 
       ' + '';'' + ISNULL(CAST([' + c.name + '] AS NVARCHAR(MAX)), ''NULL'')' 
      END 
      FROM cols c 
      ORDER BY c.column_id 
      FOR XML PATH, TYPE, ROOT).value('.', 'NVARCHAR(MAX)'), 1, 10, 'CHAR(13) + '''' +') 

    DECLARE @SQL NVARCHAR(MAX) = '  
    SET NOCOUNT ON; 
    DECLARE 
      @SQL NVARCHAR(MAX) = '''' 
     , @x INT = 1 
     , @count INT = (SELECT COUNT(1) FROM ' + @TableName + ') 

    IF EXISTS(
     SELECT 1 
     FROM tempdb.dbo.sysobjects 
     WHERE ID = OBJECT_ID(''tempdb..#import'') 
    ) 
     DROP TABLE #import; 

    SELECT ' + @SQLTinyColumns + ', ''RowNumber'' = ROW_NUMBER() OVER (ORDER BY ' + @SQLTinyColumns + ') 
    INTO #import 
    FROM ' + @TableName + ' 

    WHILE @x < @count BEGIN 

     SELECT @SQL = STUFF((
     SELECT ' + @SQLColumns + ' + ''''' + ' 
     FROM #import 
     WHERE RowNumber BETWEEN @x AND @x + 9 
     FOR XML PATH, TYPE, ROOT).value(''.'', ''NVARCHAR(MAX)''), 1, 1, '''') 

     PRINT(@SQL) 

     SELECT @x = @x + 10 

    END' 

    EXEC sys.sp_executesql @SQL 

    FETCH NEXT FROM [tables] INTO 
      @TableName 
     , @ObjectID 

END 

CLOSE [tables] 
DEALLOCATE [tables] 

出力ウィンドウでは、この(AdventureWorks.Person.Person)のようなものを得るでしょう:

1;EM;0;NULL;Ken;J;Sánchez;NULL;0;92C4279F-1207-48A3-8448-4636514EB7E2;2003-02-08 00:00:00 
2;EM;0;NULL;Terri;Lee;Duffy;NULL;1;D8763459-8AA8-47CC-AFF7-C9079AF79033;2002-02-24 00:00:00 
3;EM;0;NULL;Roberto;NULL;Tamburello;NULL;0;E1A2555E-0828-434B-A33B-6F38136A37DE;2001-12-05 00:00:00 
4;EM;0;NULL;Rob;NULL;Walters;NULL;0;F2D7CE06-38B3-4357-805B-F4B6B71C01FF;2001-12-29 00:00:00 
5;EM;0;Ms.;Gail;A;Erickson;NULL;0;F3A3F6B4-AE3B-430C-A754-9F2231BA6FEF;2002-01-30 00:00:00 
6;EM;0;Mr.;Jossef;H;Goldberg;NULL;0;0DEA28FD-EFFE-482A-AFD3-B7E8F199D56F;2002-02-17 00:00:00 
3

でこれを解決するよりも、本当に簡単です。私もこのコマンドに新しいですが、私はthis linkに続き、それは私のために働いた。

0

私はまた、bcpを使用して

xp_cmdshellをのためのあなたの@sql@cmd変数としてVARCHAR(MAX)を使用しないでくださいこのスレッドを見つけた場合に他の人に利益をもたらす夫婦他の有用な記事を見つけました。あなたが取得し、エラー

メッセージ214、レベル16、状態201、プロシージャxp_cmdshellを、ラインパラメータ 'varchar型' タイプの 'COMMAND_STRING' を期待し 1つの手順します。

http://www.sqlservercentral.com/Forums/Topic1071530-338-1.aspx

使用NULLIF代わりNUL(バイナリエディタ、またはメモ帳++で表示)のCSVファイルの空白を取得します。私はbcpのSELECT文で

How to make Microsoft BCP export empty string instead of a NUL char?

0

あなたはこれらの は、このウェブサイト

https://www.excel-sql-server.com/sql-server-export-to-excel-using-bcp-sqlcmd-csv.htm

に与えられた手順に従ってくださいSQLからCSVを作成するには従って、保存するには、このリンクを使用することができます使用しましたいくつかの物理的な場所に。

https://www.codeproject.com/Questions/546777/HowplusToplusExportplusDataplusToplustheplus-csvpl

+0

SQL ServerにWindowsエクスプローラを開いて、ユーザーがファイルの名前と場所を保存できるようにする方法はありますか? – tCoe

+0

https://www.codeproject.com/Questions/546777/HowplusToplusExportplusDataplusToplustheplus-csvpl –

0

ただ、最終的に働いているこれを行うためのネイティブの方法に答えるために、すべてが私には、以下の回答に加えて、varchar型

ALTER PROCEDURE [clickpay].[sp_GetDocuments] 

@Submid bigint 

AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 
    DECLARE @raw_sql varchar(max) 

DECLARE @columnHeader VARCHAR(max) 
SELECT @columnHeader = COALESCE(@columnHeader+',' ,'')+ ''''+column_name +'''' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Documents' 

DECLARE @ColumnList VARCHAR(max) 
SELECT @ColumnList = COALESCE(@ColumnList+',' ,'')+ 'CAST('+column_name +' AS VARCHAR)' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Documents' 

SELECT @raw_sql = 'SELECT '+ @columnHeader +' UNION ALL SELECT ' + @ColumnList + ' FROM ' + 'Documents where Submid = ' + CAST(@Submid AS VARCHAR) 

-- Insert statements for procedure here 
exec(@raw_sql) 

END

関連する問題