在Windows批处理中-如何用转义单引号替换单引号以提供SQL

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

对于我的Windows批处理文件,我具有以下SQL语句:

FOR /F "eol=; tokens=1,2,3,4,5,6* delims=, " %a in (myfile.txt) do(
    sqlcmd -SmYSerbver  -Uhhh -P12345 -dmyDB_Admin -Q"insert into tableA (UserID,FirstName,LastName,Email,DisplayName,OrgUnit,LoadDate) values('%%a','%%b','%%c','%%d','%%e','%%f',getdate())"
)

一个用户的姓为“ O'Brien”-我的变量%% c被评估为O'Brien。

如何使%% c评估为“ O''Brien”?

sql windows batch-file escaping quote
2个回答
2
投票

您需要一个临时变量来进行字符串替换,因为相关语法无法直接应用于像for这样的%%c变量。为此,需要启用delayed variable expansion,并且需要使用!!而不是%%扩展临时变量。

下面说明如何使用临时变量%%c实现c_tmp中的值:

setlocal EnableDelayedExpansion
for /F "eol=; tokens=1,2,3,4,5,6* delims=, " %%a in (myfile.txt) do (
    set "c_tmp=%%c" & set "c_tmp=!c_tmp:'=''!"
    sqlcmd -SmYSerbver  -Uhhh -P12345 -dmyDB_Admin -Q"insert into tableA (UserID,FirstName,LastName,Email,DisplayName,OrgUnit,LoadDate) values('%%a','%%b','!c_tmp!','%%d','%%e','%%f',getdate())"
)
endlocal

[当%%c包含字符串O'Brien时,c_tmp最终将包含O''Brien

当然,您也可以通过相应地修改命令set "c_tmp=!c_tmp:'=''!"来进行其他替换。


0
投票

如果sqlcmd未能插入,也许可以像\一样用O\'brian转义单引号。

如果文件包含的单引号不用于值的定界,则可以替换中间文件中的所有引号。

(
echo O'Brian1a, O'Brian1b, O'Brian1c, O'Brian1d, O'Brian1e, O'Brian1f
echo O'Brian2a, O'Brian2b, O'Brian2c, O'Brian2d, O'Brian2e, O'Brian2f
echo O'Brian3a, O'Brian3b, O'Brian3c, O'Brian3d, O'Brian3e, O'Brian3f
)>%tmp%\myfile.tmp

( 
  for /f "delims=" %%i in (%tmp%\myfile.tmp) do (
    set "i=%%i"
    setlocal enabledelayedexpansion
    echo !i:'=\'!
  )
)>%tmp%\int-myfile.tmp

for /f "tokens=1-6 delims=, " %%a in (%tmp%\int-myfile.tmp) do ( 
  echo '%%a','%%b','%%c','%%d','%%e','%%f'
)

输出:

'O\'Brian1a','O\'Brian1b','O\'Brian1c','O\'Brian1d','O\'Brian1e','O\'Brian1f'
'O\'Brian2a','O\'Brian2b','O\'Brian2c','O\'Brian2d','O\'Brian2e','O\'Brian2f'
'O\'Brian3a','O\'Brian3b','O\'Brian3c','O\'Brian3d','O\'Brian3e','O\'Brian3f'

作为最后的选择,您始终可以选择在行中替换哪个字符:echo !i:'=\'!

© www.soinside.com 2019 - 2024. All rights reserved.