Procédure stockée qui exporte les données dans des fichiers csv seules les exportations vers un fichier
J'ai un plaisir script:
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
Qu'il est censé faire est d'exporter des données dans des fichiers csv. Les noms des fichiers doivent être:
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
mais il stocke toutes les données dans le même:
C:\test\ViewAccountDetail2011-01-01.csv
j'ai fait un print @FileLocation
et a confirmé qu'il met correctement à jour cette variable.
est-il apparent, ÉVIDENT chose qui me manque ici?
Pour info cette ligne:
EXEC BCP_Text_File @TableName, @FileLocation
appelle cette procédure:
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
je vous remercie beaucoup pour votre aide et vos conseils!!
Ré-écrire cette ligne comme
Essayez de réduire votre code de quelques lignes que vraiment le cœur du problème et ne nécessitent pas de tous les appels à des procédures externes. On peut ensuite essayer d'exécuter le code, pour nous-mêmes. Si je vais à déboguer ce que je veux quelque chose, je peux copier+coller dans SSMS et de l'exécuter sans aucune erreurs, manque de tables, de manque de procédures stockées, etc. En d'autres termes, de faire une simple, autonome exemple qui reproduit votre erreur.
essayez de modifier cette trop
J'ai une réponse, et DONC les erreurs à chaque fois que j'essaie de poster... Ce code, tel qu'il est, fonctionne pour moi. Les dates des trucs fonctionne très bien @CoDeaDDict, et les fichiers sont tous créés avec les mêmes données (le contenu de la table envoyé dans la procédure stockée). Êtes-vous sûr que vous utilisez le code que vous avez donné?
Quand j'ai remplacer "SELECT @MinDOS = '20110101'" "MIN(dos) DE accn_demographics", j'obtiens le résultat souhaité, de sorte que vous pouvez commencer par regarder la valeur retournée par accn_demographics.
SET @FileLocation='C:\test\'+@TableName+convert(varchar(20),@StartDT)+'.csv'
Essayez de réduire votre code de quelques lignes que vraiment le cœur du problème et ne nécessitent pas de tous les appels à des procédures externes. On peut ensuite essayer d'exécuter le code, pour nous-mêmes. Si je vais à déboguer ce que je veux quelque chose, je peux copier+coller dans SSMS et de l'exécuter sans aucune erreurs, manque de tables, de manque de procédures stockées, etc. En d'autres termes, de faire une simple, autonome exemple qui reproduit votre erreur.
essayez de modifier cette trop
SET @StartDT = DATEADD(month,1,@StartDT)
J'ai une réponse, et DONC les erreurs à chaque fois que j'essaie de poster... Ce code, tel qu'il est, fonctionne pour moi. Les dates des trucs fonctionne très bien @CoDeaDDict, et les fichiers sont tous créés avec les mêmes données (le contenu de la table envoyé dans la procédure stockée). Êtes-vous sûr que vous utilisez le code que vous avez donné?
Quand j'ai remplacer "SELECT @MinDOS = '20110101'" "MIN(dos) DE accn_demographics", j'obtiens le résultat souhaité, de sorte que vous pouvez commencer par regarder la valeur retournée par accn_demographics.
OriginalL'auteur l--''''''---------'''''''''''' | 2012-06-14
Vous devez vous connecter pour publier un commentaire.
Semble bien fonctionner pour moi. J'ai quelques suggestions:
(1) d'arrêter de faire tout ce qui est la concaténation de chaîne de construire un jour. Vous pouvez faire la même chose beaucoup plus facile que dans:
(2) arrêt déclarant
varchar
sans longueur. Et pour garantir le droit de sortie, je préfère convertir:(3) au lieu de "débogage" le code en cours d'exécution de la procédure stockée et l'inspection de la sortie dans le dossier, pourquoi ne pas la santé mentale-vérifiez votre saisie en premier? Aussi, pourquoi utiliser deux variables pour la date?
OriginalL'auteur Aaron Bertrand