Tôi đang cố gắng để có một tập lệnh trong tệp bó của mình chạy Thủ tục lưu trữ SQL Server. Số lượng lớn Thủ tục lưu trữ sẽ chèn dữ liệu từ tệp .CSV vào bảng SQL Server. Khi tôi chạy Thủ tục lưu trữ trên SQL Server, nó sẽ chạy mà không gặp vấn đề gì. Tuy nhiên, khi tôi cố gắng làm cho nó hoạt động trong tệp bó của mình, nó đã thất bại
Kịch bản lô của tôi là
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
Tập lệnh SQL gọi ra Thủ tục lưu trữ
DECLARE @return_value int
EXEC @return_value = [dbo].[CST_SN_ADD_SPS_CUSTOMER_ORDER_STG_TMP]
SELECT 'Return Value' = @return_value
GO
Và thủ tục lưu trữ
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
Quy trình được lưu trữ chạy trên SQL Server, vì vậy tôi cho rằng lỗi của tôi nằm ở tập lệnh bó hoặc các quyền có khả năng cho đường dẫn tệp
Có lẽ cũng hữu ích khi tiết lộ thông báo lỗi nào bạn nhận được hoặc thấy khi nó không hoạt động như mong đợi. Hãy thử chạy từng lệnh trên dòng lệnh thay vì trong tập lệnh bó và tìm điểm mà bạn thấy lỗi đầu tiên khi bạn ngắt nó và chạy thủ công thông qua dòng lệnh và chỉnh sửa câu hỏi của bạn để biết về chi tiết này. Tôi có thể nghĩ ra một vài điều dựa trên cách diễn đạt hiện tại của bạn và nhận xét đầu tiên của tôi chỉ là một vì vậy có thể thêm chi tiết và cho biết bạn gặp lỗi gì và tại điểm nào trong quy trình khi bạn chạy các lệnh tương quan bằng tay thông qua dòng lệnh.
—
Pimp Juice IT
Và đừng quên rằng đó
—
Pimp Juice IT
\\usashsmdbpcw02f\C$
là một chia sẻ quản trị ẩn, vì vậy tôi cho rằng điều này có nghĩa là chạy SP trên SQL Server nơi nó hoạt động là vì khi bạn thực hiện nó từ đó, bối cảnh bảo mật đó có quyền truy cập vào chia sẻ quản trị viên ẩn đó trên usashsmdbpcw02f
máy được đặt tên.
\\usashsmdbpcw02f\C$\SNI_Logility\ADD_CUSTOMER_ORDER_STG.csv
bằng cách thêmEXECUTE AS LOGIN = 'domain\username';
vào SP ở đâu đó trướcBULK INSERT
câu lệnh và xem điều đó có khác biệt gì không. Việc thực thi SP từ SSMS so với sqlcmd rất có thể có những khác biệt về bảo mật mà SP thực thi theo từng cách để chỉ định SP thay đổi thành bối cảnh bảo mật rõ ràng trong tập lệnh mà bạn biết có quyền truy cập vào chia sẻ tệp sẽ giải quyết ở cấp độ này .