Stapelfehler SQL Server BULK INSERT

438
baskinsr

Ich versuche, ein Skript in meiner Stapeldatei zu haben, in dem eine gespeicherte Prozedur von SQL Server ausgeführt wird. Die gespeicherte Prozedur fügt Daten aus einer CSV-Datei in eine SQL Server-Tabelle ein. Wenn ich die gespeicherte Prozedur auf SQL Server ausführen, wird sie ohne Probleme ausgeführt. Wenn ich jedoch versuche, es in meiner Batchdatei zum Laufen zu bringen, schlägt dies fehl

Mein Batch-Skript ist

set STEP_NBR=STEP113 set SQL_Script_Name= CST_SN_ADD_SPS_CUSTOMER_ORDER_STG_TMP set ERROR_MSG=%STEP_NBR% %SQL_Script_Name% call "%DIR_BAT%\CreateLAFMessage.bat" "%~n0.bat-> %STEP_NBR% - Running %SQL_Script_Name%.sql" %_LAF_MSG_DETAILS% SQLCMD.EXE %SQLCMD_VARS% -S%DB_SERVER_NAME% -d%DB_SP01_NAME% -w2048 -E -b -i"%DIR_SQL%\%SQL_Script_Name%.sql" -o"%DIR_LOG%\%SQL_Script_Name%.lst" IF NOT %ERRORLEVEL%==0 GOTO ON_ERROR 

Das SQL-Skript ruft die gespeicherte Prozedur auf

DECLARE @return_value int EXEC @return_value = [dbo].[CST_SN_ADD_SPS_CUSTOMER_ORDER_STG_TMP] SELECT 'Return Value' = @return_value GO 

Und das gespeicherte Verfahren

USE [LVSDB_DRP01] GO /****** Object: StoredProcedure [dbo].  [CST_SN_ADD_SPS_CUSTOMER_ORDER_STG_TMP] Script Date: 9/10/2018 10:28:30 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO  ALTER Procedure [dbo].[CST_SN_ADD_SPS_CUSTOMER_ORDER_STG_TMP]  as  BEGIN  BEGIN TRANSACTION;  IF OBJECT_ID('staging.dbo.ADD_CUSTOMER_ORDER_STG_TMP', 'U') IS NULL CREATE TABLE [staging].[dbo].[ADD_CUSTOMER_ORDER_STG_TMP]( [ITEM_INDX] [nvarchar](50) NOT NULL, [LOC_INDX] [nvarchar](50) NOT NULL, [CUST_ORD_INDX] [nvarchar](50) NOT NULL, [CUST_ORD_LIN_NBR] [nvarchar](50) NOT NULL, [CUST_ORD_ORD_DATE] [date] NOT NULL, [CUST_ORD_QTY] [nvarchar](50) NULL, [CUST_SHP_QTY] [nvarchar](50) NULL, [SET_ITEM_INDX] [nvarchar](50) NOT NULL, [HEADER_COMPONENT] [nvarchar](50) NOT NULL, [BUCKET] [nvarchar](50) NOT NULL )  IF OBJECT_ID('staging.dbo.ADD_CUSTOMER_ORDER_STG_TMP', 'U') IS NOT NULL Truncate table staging.dbo.ADD_CUSTOMER_ORDER_STG_TMP;  IF OBJECT_ID('staging.dbo.ADD_CUSTOMER_ORDER_STG_TMP', 'U') IS NOT NULL BULK INSERT staging.dbo.ADD_CUSTOMER_ORDER_STG_TMP FROM '\\usashsmdbpcw02f\C$\SNI_Logility\ADD_CUSTOMER_ORDER_STG.csv' WITH    (     FIELDTERMINATOR = ',', FIRSTROW = 2 --    ROWTERMINATOR = '\r\n'   );  COMMIT TRANSACTION; END 

Die gespeicherte Prozedur wird auf SQL Server ausgeführt, daher gehe ich davon aus, dass mein Fehler im Batch-Skript oder potenziellen Berechtigungen für den Dateipfad liegt

0
Fügen Sie ein Login hinzu, das Sie für diesen SQL-Zugriff definiert haben, und Sie können bestätigen, dass es mindestens Lesezugriff auf die "\\ usashsmdbpcw02f \ C $ \ SNI_Logility \ ADD_CUSTOMER_ORDER_STG.csv" hat, indem Sie "EXECUTE AS LOGIN =" domain \ username "hinzufügen. ; `zum SP irgendwo vor der` BULK INSERT`-Anweisung und sehen, ob das einen Unterschied macht. Bei der Ausführung des SP von SSMS im Vergleich zu sqlcmd kann es sehr wohl Sicherheitsunterschiede geben, die SP auf unterschiedliche Weise ausführt, so dass angegeben wird, dass der SP explizit in einen Sicherheitskontext innerhalb des Skripts wechselt, von dem Sie wissen, dass der Zugriff auf eine Dateifreigabe auf dieser Ebene aufgelöst werden soll . Pimp Juice IT vor 5 Jahren 0
Es ist möglicherweise hilfreich, auch anzugeben, welche Fehlermeldung Sie erhalten oder sehen, wenn die Fehlermeldung nicht wie erwartet funktioniert. Versuchen Sie, jeden Befehl in der Befehlszeile und nicht im Batch-Skript auszuführen. Finden Sie heraus, an welcher Stelle der erste Fehler angezeigt wird, wenn Sie ihn aufteilen, und führen Sie ihn manuell über die Befehlszeile und Ihre Frage aus, um Informationen zu diesem Detail zu erhalten. Ich kann mir ein paar Dinge überlegen, die auf Ihrer aktuellen Formulierung basieren. Mein erster Kommentar war nur ein einziges. Fügen Sie also möglicherweise weitere Details hinzu und sagen Sie, welchen Fehler Sie an welchem ​​Punkt des Prozesses erhalten, wenn Sie die korrelierten Befehle manuell über die Befehlszeile ausführen. Pimp Juice IT vor 5 Jahren 0
Und vergessen Sie nicht, dass \\ usashsmdbpcw02f \ C $ `eine versteckte Administratorfreigabe ist. Ich gehe davon aus, dass Sie den SP auf dem SQL Server ausführen, wo er funktioniert. Wenn Sie ihn von dort aus ausführen, hat der Sicherheitskontext Zugriff darauf versteckte Admin-Freigabe auf der `usashsmdbpcw02f`-Maschine. Pimp Juice IT vor 5 Jahren 0

0 Antworten auf die Frage