[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) 정지 날짜를 구축하는 모든 문자열 연결을하고. 당신은에서와 같이 훨씬 쉽게 같은 일을 할 수 있습니다 :
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
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
'SQL' 카테고리의 다른 글
[SQL] 어떻게 두 개의 열에서 최대 값을 가진 레코드를 선택하려면? (0) | 2020.05.16 |
---|---|
[SQL] 엔티티 프레임 워크. 테이블의 모든 행을 삭제 (0) | 2020.05.16 |
[SQL] 값이 포스트 그레스 배열에 존재하는지 확인 (0) | 2020.05.16 |
[SQL] MySQL로 변환 SQL Server 쿼리 [중복] (0) | 2020.05.16 |
[SQL] MySQL의에서 마지막 레코드를 얻기 (0) | 2020.05.16 |