복붙노트

[SQL] 저장 프로 시저가 CSV 파일에 수출 데이터를 하나 개의 파일 만 수출

SQL

저장 프로 시저가 CSV 파일에 수출 데이터를 하나 개의 파일 만 수출

나는 재미있는 스크립트가 :

DECLARE @StartDT DATE
DECLARE @MinDOS DATE
DECLARE @TableName VARCHAR(50)
SET @TableName = 'ViewAccountDetail'
SELECT @MinDOS = MIN(dos) FROM accn_demographics
SELECT @StartDT = 
    CAST(CAST(datepart(YYYY,@MinDOS) AS varchar) + '-' + CAST(datepart(mm,@MinDOS) AS varchar) + '-' + CAST('01' AS varchar) AS DATETIME)
DECLARE @FileLocation VARCHAR(50)

WHILE @StartDT < '20110901'
BEGIN
    SET @FileLocation='C:\test\'+@TableName+cast(@StartDT as varchar)+'.csv'
    EXEC BCP_Text_File @TableName, @FileLocation    
    SET @StartDT = DATEADD(MONTH,1,@StartDT)
END

그것은 어떻게해야되는 것은 CSV 파일로 데이터를 내보낼 수 있습니다. 파일의 이름은해야합니다 :

C:\test\ViewAccountDetail2011-01-01.csv
C:\test\ViewAccountDetail2011-02-01.csv
C:\test\ViewAccountDetail2011-03-01.csv
C:\test\ViewAccountDetail2011-04-01.csv
C:\test\ViewAccountDetail2011-05-01.csv
C:\test\ViewAccountDetail2011-06-01.csv
C:\test\ViewAccountDetail2011-07-01.csv
C:\test\ViewAccountDetail2011-08-01.csv

하지만 같은 일에 모든 데이터를 저장합니다 :

C:\test\ViewAccountDetail2011-01-01.csv

나는 인쇄 @FileLocation를하고 올바르게이 변수를 갱신 것을 확인했다.

내가 여기에 놓치고 있다는 명백한, 분명한 점은 무엇입니까?

참고로이 라인 :

EXEC BCP_Text_File @TableName, @FileLocation

이 프로 시저 호출 :

  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 -T''';  

    EXEC sp_executesql @sql;
  END
  ELSE
  BEGIN
    SELECT 'The table '+@table+' does not exist in the database';
  END
END

GO

여러분의 도움과지도를 위해 정말 감사합니다!

해결법

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

    1.나를 위해 벌금을 작동하는 것 같다. 나는 몇 가지 제안이 있습니다

    나를 위해 벌금을 작동하는 것 같다. 나는 몇 가지 제안이 있습니다

    (1) 정지 날짜를 구축하는 모든 문자열 연결을하고. 당신은에서와 같이 훨씬 쉽게 같은 일을 할 수 있습니다 :

    SELECT @StartDT = DATEADD(MONTH, DATEDIFF(MONTH, '19000101', @MinDOS), '19000101');
    

    (2) 정지없이 길이 VARCHAR 선언. 그리고 오른쪽 출력을 보장하기 위해, 나는 변환을 선호한다 :

    SET @FileLocation = 'C:\test\' + @TableName
       + CONVERT(CHAR(10), @StartDT, 120) + '.csv';
    

    (3) 대신 저장 프로 시저를 실행하고 폴더에 출력을 검사하여 코드를 "디버깅"왜 정신 체크 먼저 입력을? 또한, 왜 날짜는 2 개 가지 변수를 사용?

    DECLARE 
       @StartDT DATE, 
       @TableName NVARCHAR(50), 
       @FileLocation VARCHAR(255);
    
    SET @TableName = N'ViewAccountDetail';
    
    SELECT @StartDT = DATEADD(MONTH, DATEDIFF(MONTH, '19000101', MIN(dos)), '19000101')
       FROM dbo.accn_demographics;
    
       PRINT @StartDT;
    -- ^^^^^ debugging 101 - what month do we think we're starting at?
    
    WHILE @StartDT < '20110901'
    BEGIN
        SET @FileLocation = 'C:\test\' + @TableName
          + CONVERT(CHAR(10), @StartDT, 120) + '.csv';
    
          PRINT @FileLocation;
        --^^^^^ again, debugging 101 - what does the filename currently look like?
    
        --EXEC BCP_Text_File @TableName, @FileLocation    
        SET @StartDT = DATEADD(MONTH, 1, @StartDT);
    END
    
  2. from https://stackoverflow.com/questions/11039324/stored-procedure-that-exports-data-into-csv-files-only-exports-to-one-file by cc-by-sa and MIT license