批处理文件显示意外选择的问题

问题描述 投票:0回答:1

我有以下批处理文件(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 是意外的。”

我尝试调试并转义一些“)”,但到目前为止还算幸运。

batch-file window
1个回答
0
投票

问题很复杂,因为很难调试。请检查下面的代码并按照我更改的步骤进行操作。通过更多调试,您可以修复它。

@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%"

所做的更改:

  1. 通过在
    IF NOT EXISTS
    子句之前放置
    ^
    正确地转义右括号。
  2. IF NOT EXISTS
    块中添加了正确的 SQL 脚本行,确保其格式针对 SQL Server 正确。
  3. 最后添加了
    COMMIT;
    GO
    以正确关闭交易。
© www.soinside.com 2019 - 2024. All rights reserved.