我有以下批处理文件(Windows): @回声开 setlocal EnableDelayedExpansion
设置 SERVER_NAME=MSI\BTFSERVERMAIN 设置“DATABASE_NAME = TESTDB” 设置“TABLE_NAME=员工” 设置“DATA_FILE=C:\BatchSQLTest\data.txt”
REM 使用事务管理初始化 SQL 脚本 回显开始交易; >“%SQL_FILE%” echo GO>>“%SQL_FILE%”
for /f "usebackq tokens=*" %%A in ("%DATA_FILE%") do ( 设置“行=%%A” echo 读取行:!line! 对于 /f“标记=1-4 delims=|” %%B in ("!line!") 做 ( 设置“名称=%%B” 设置“年龄=%%C” 设置“收入=%%D” 设置“地址=%%E”
REM Escape single quotes in Name and Address
set "EscapedName=!Name:'=''!"
set "EscapedAddress=!Address:'=''!"
echo Parsed - Name: !Name!, Age: !Age!, Income: !Income!, Address: !Address!
echo IF NOT EXISTS (SELECT 1 FROM Employee WHERE Name = '!EscapedName!'^)
IF NOT EXISTS (SELECT 1 FROM Employee WHERE Name = '!EscapedName!'^) (
echo Name '!Name!' already exists in table, skipping insertion.
echo GO >> "%SQL_FILE%" ;; Add an empty GO statement for proper script formatting
^)
) )
当 UI 运行它时,我得到“(此时 SELECT 是意外的。”
我尝试调试并转义一些“)”,但到目前为止还算幸运。
问题很复杂,因为很难调试。请检查下面的代码并按照我更改的步骤进行操作。通过更多调试,您可以修复它。
@echo On
setlocal EnableDelayedExpansion
set SERVER_NAME=MSI\BTFSERVERMAIN
set "DATABASE_NAME=TESTDB"
set "TABLE_NAME=Employee"
set "DATA_FILE=C:\BatchSQLTest\data.txt"
set "SQL_FILE=C:\BatchSQLTest\output.sql"
REM Initialize the SQL script with transaction management
echo BEGIN TRANSACTION; > "%SQL_FILE%"
echo GO >> "%SQL_FILE%"
for /f "usebackq tokens=*" %%A in ("%DATA_FILE%") do (
set "line=%%A"
echo Read line: !line!
for /f "tokens=1-4 delims=|" %%B in ("!line!") do (
set "Name=%%B"
set "Age=%%C"
set "Income=%%D"
set "Address=%%E"
REM Escape single quotes in Name and Address
set "EscapedName=!Name:'=''!"
set "EscapedAddress=!Address:'=''!"
echo Parsed - Name: !Name!, Age: !Age!, Income: !Income!, Address: !Address!
echo IF NOT EXISTS (SELECT 1 FROM !TABLE_NAME! WHERE Name = '!EscapedName!'^) >> "%SQL_FILE%"
echo BEGIN >> "%SQL_FILE%"
echo PRINT 'Name !Name! does not exist in table, inserting.' >> "%SQL_FILE%"
echo INSERT INTO !TABLE_NAME! (Name, Age, Income, Address) VALUES ('!EscapedName!', !Age!, !Income!, '!EscapedAddress!') >> "%SQL_FILE%"
echo END >> "%SQL_FILE%"
echo GO >> "%SQL_FILE%" ;; Add an empty GO statement for proper script formatting
)
)
echo COMMIT; >> "%SQL_FILE%"
echo GO >> "%SQL_FILE%"
所做的更改:
IF NOT EXISTS
子句之前放置 ^
正确地转义右括号。IF NOT EXISTS
块中添加了正确的 SQL 脚本行,确保其格式针对 SQL Server 正确。COMMIT;
和 GO
以正确关闭交易。