在 SQL 中执行外部 SQL 脚本

Execute external SQL scripts in SQL

提问人:Matt Farrell 提问时间:11/8/2023 更新时间:11/8/2023 访问量:35

问:

我正在尝试构建一个 sql 脚本,我可以将其分解为一口大小的部分以使其更易于维护,但是我正在努力让它工作并且使用 AI 来帮助调试它没有帮助。我想知道是否有人可以给我一些见解,为什么我不能简单地执行一个单独的 sql 脚本?

-- Main SQL script for creating demo/test data
-- Prompt the user for clearing the database (Y/N)
DECLARE @ClearDatabaseOption CHAR(1)
SET @ClearDatabaseOption = 'Y' -- Change to 'Y' to clear the database

-- Check if the user wants to clear the database
IF @ClearDatabaseOption = 'Y'
BEGIN
    -- Execute a script to clear the database
    EXEC sp_executesql N':r PurchasingDataScripts\clear_database.sql';    
END
ELSE
BEGIN
-- Set up a transaction to ensure all or none of the changes are committed
BEGIN TRANSACTION;

-- Step 1: Create default document type groups
BEGIN TRY
    EXEC sp_executesql N':r PurchasingDataScripts\create_default_document_type_groups.sql';
END TRY
BEGIN CATCH
    ROLLBACK;
    PRINT 'Step 1: Error encountered. Rolling back changes.';
    RETURN;
END CATCH

-- Step 2: Create default document types
BEGIN TRY
    EXEC sp_executesql N'
    :r PurchasingDataScripts\create_default_document_types.sql
    ';
END TRY
BEGIN CATCH
    ROLLBACK;
    PRINT 'Step 2: Error encountered. Rolling back changes.';
    RETURN;
END CATCH

-- Step 3: Create default document sequences
BEGIN TRY
    EXEC sp_executesql N'
    :r PurchasingDataScripts\create_default_document_sequences.sql
    ';
END TRY
BEGIN CATCH
    ROLLBACK;
    PRINT 'Step 3: Error encountered. Rolling back changes.';
    RETURN;
END CATCH

-- Step 4: Create default profile
BEGIN TRY
    EXEC sp_executesql N'
    :r PurchasingDataScripts\create_default_profile.sql
    ';
END TRY
BEGIN CATCH
    ROLLBACK;
    PRINT 'Step 4: Error encountered. Rolling back changes.';
    RETURN;
END CATCH

-- Step 5: Create Contacts
BEGIN TRY
    EXEC sp_executesql N'
    :r PurchasingDataScripts\create_contacts.sql
    ';
END TRY
BEGIN CATCH
    ROLLBACK;
    PRINT 'Step 5: Error encountered. Rolling back changes.';
    RETURN;
END CATCH

-- Step 6: Create demo documents
BEGIN TRY
    EXEC sp_executesql N'
    :r PurchasingDataScripts\create_demo_documents.sql
    ';
END TRY
BEGIN CATCH
    ROLLBACK;
    PRINT 'Step 6: Error encountered. Rolling back changes.';
    RETURN;
END CATCH

-- Step 7: Create demo people
BEGIN TRY
    EXEC sp_executesql N'
    :r PurchasingDataScripts\create_demo_people.sql
    ';
END TRY
BEGIN CATCH
    ROLLBACK;
    PRINT 'Step 7: Error encountered. Rolling back changes.';
    RETURN;
END CATCH

-- Step 8: Create Purchasing Profile Finance Codes
BEGIN TRY
    EXEC sp_executesql N'
    :r PurchasingDataScripts\create_purchasing_profile_finance_codes.sql
    ';
END TRY
BEGIN CATCH
    ROLLBACK;
    PRINT 'Step 8: Error encountered. Rolling back changes.';
    RETURN;
END CATCH

-- Step 9: Create PurchasingEvents
BEGIN TRY
    EXEC sp_executesql N'
    :r PurchasingDataScripts\create_purchasing_events.sql
    ';
END TRY
BEGIN CATCH
    ROLLBACK;
    PRINT 'Step 9: Error encountered. Rolling back changes.';
    RETURN;
END CATCH

-- If all steps completed successfully, commit the changes
COMMIT;
PRINT 'All steps completed successfully. Changes have been committed.';

-- End of the main script

我试过了

DECLARE @CmdString NVARCHAR(4000);
SET @CmdString = 'sqlcmd -S server -d database -E -i "PurchasingDataScripts\clear_database.sql"';
EXEC xp_cmdshell @CmdString;

-- Disable xp_cmdshell for security (optional)
EXEC sp_configure 'xp_cmdshell', 0;
RECONFIGURE;

SQL 服务器 SSMS

评论

0赞 siggemannen 11/8/2023
这是什么东西?sp_executesql无法执行外部脚本,则看起来您为此作业使用了错误的工具。:r
0赞 Thom A 11/8/2023
这就是 sqlcmd 实用程序@siggemannen。
3赞 Thom A 11/8/2023
如果只想在 SSMS 中使用 sqlcmd 执行文件的内容,只需执行以下操作:r <File path>
3赞 Thom A 11/8/2023
例如。这看起来更像是 AI 把你送进了兔子洞(我称之为 CrapGPT 是有原因的)。只需引用文件,您不需要任何这些东西。对我来说充其量只是一个印刷错误。sp_executesql
1赞 Matt Farrell 11/9/2023
老实说,你没有错,我知道在 SQL 中执行脚本是可能的,但从来不需要这样做,所以试一试,我过去用 SQL 执行过存储过程等,所以部分尝试了我自己,是的使用了 AI。我发现,如果你大致知道什么是对的,什么是错的,人工智能可以是一个很好的工具,但在这种情况下,我是在空中射击。我已将其编写为有效的powershell脚本。

答: 暂无答案