2015-10-06 57 views
0

随着我的Windows批处理文件,我有以下SQL语句:在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())" 
) 

一个用户的姓氏是“奥布莱恩” - 我的变量%% c被评估为O'Brien。

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

+0

提供更多的代码,请;所有'%%'变量从哪里来? – aschipfl

+0

我使用:以下字符串替换和它不工作: 组%% B = %%% B: '=' '% \t \t集%%一个= %%%一个:'= '' % \t \t set %% f = %%% f:'=''% \t \t set %% c = %%% c:'=''% \t \t set %% d = %%% d:'='' % –

+0

您不能将字符串替换语法'%VAR:str = rpl%'应用于'for'变量,您需要一个临时“正常”变量,但由于'for' ...需要延迟扩展并插入一个在'do'和'('... – aschipfl

回答

1

您需要一个临时变量来进行字符串替换,因为相关语法不能直接应用于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'Brienc_tmp最终将包含O''Brien

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

+0

我用2个单引号替换它,它的工作原理如下: 设置“c_tmp = %% c”&设置“c_tmp =!c_tmp:'=''!” –

+0

啊,显然我误读了''''作为'''......无论如何,你知道它是如何工作的并且自己避开它...所以我调整了我的答案以符合... – aschipfl

0

也许你可以跳过单引号\O\'brian如果是sqlcmd未能插入。

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

(
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:'=\'!