복붙노트

[SQL] 어떻게 SQL Server의 저장 프로 시저에서 CSV 출력 파일을 생성합니다

SQL

어떻게 SQL Server의 저장 프로 시저에서 CSV 출력 파일을 생성합니다

그것은 SQL Server의 저장 프로 시저에서 csv 파일을 생성 할 수 있습니까? 내가 저장 프로 시저를 만들어 내가 CSV로 어떤 결과를 저장하려면, 누군가 알고 어떻게 이것을 달성하기 위해 무엇입니까?

해결법

  1. ==============================

    1.나는 BCP 명령을 사용할 수 있습니다 생각합니다. 또한이 명령에 새로운 오전하지만 난이 링크를 따라하고 나를 위해 일했다.

    나는 BCP 명령을 사용할 수 있습니다 생각합니다. 또한이 명령에 새로운 오전하지만 난이 링크를 따라하고 나를 위해 일했다.

  2. ==============================

    2.이 답변에 제안이 사용 OPENROWSET을 할 수 있습니다. Slogmeister Extrarodinare 대답을 재개시 :

    이 답변에 제안이 사용 OPENROWSET을 할 수 있습니다. Slogmeister Extrarodinare 대답을 재개시 :

    를 사용하여 T-SQL

    INSERT INTO OPENROWSET ('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
    SELECT Field1, Field2, Field3 FROM DatabaseName
    

    그러나,주의의 몇 가지가 있습니다 :

  3. ==============================

    3.어떤 테이블 구조 출력 창에서 CSV 형식으로 지정된 테이블에서이 스크립트는 수출 행을. 희망이 스크립트는 당신을 위해 도움이 될 것입니다 -

    어떤 테이블 구조 출력 창에서 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
    
  4. ==============================

    4.그것에 대해 정말 도움이 링크를 발견. 이를 위해 SQLCMD를 사용하여 저장 프로 시저와 함께이 문제를 해결하는 것보다 정말 쉽습니다

    그것에 대해 정말 도움이 링크를 발견. 이를 위해 SQLCMD를 사용하여 저장 프로 시저와 함께이 문제를 해결하는 것보다 정말 쉽습니다

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

  5. ==============================

    5.나는 또한이 스레드를 찾는 경우에 다른 사람을 도움이 될 다른 도움이 게시물을 BCP 사용하고 몇 가지 발견

    나는 또한이 스레드를 찾는 경우에 다른 사람을 도움이 될 다른 도움이 게시물을 BCP 사용하고 몇 가지 발견

    당신의 @Sql 또는 xp_cmdshell을위한 @cmd 변수로 VARCHAR (MAX)를 사용하지 마십시오; 당신이 얻을 수 및 오류합니다

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

    사용 NULLIF는 (16 진수 편집기 나 메모장 ++에서 볼 수) 대신 NUL의 csv 파일에 대한 공백을 얻을 수 있습니다. 나는 BCP에 대한 SELECT 문에 그 사용

    마이크로 소프트는 어떻게 BCP 수출 빈 문자열 대신에 NULL 문자를 만드는 방법?

  6. ==============================

    6.그냥 마지막으로 일한이 작업을 수행 할 수있는 기본 방법을 대답 모든는 VARCHAR로 주조해야했다

    그냥 마지막으로 일한이 작업을 수행 할 수있는 기본 방법을 대답 모든는 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
    
  7. ==============================

    7.나는이 시도하고 나를 위해 잘 작동한다 :

    나는이 시도하고 나를 위해 잘 작동한다 :

    sqlcmd -S servername -E -s~ -W -k1 -Q  "sql query here" > "\\file_path\file_name.csv"
    
  8. from https://stackoverflow.com/questions/16079666/how-to-produce-an-csv-output-file-from-stored-procedure-in-sql-server by cc-by-sa and MIT license