由于在SQL查询中使用单引号和双引号,通过批处理文件调用.SQL文件时出现问题

由于在SQL查询中使用单引号和双引号,通过批处理文件调用.SQL文件时出现问题,sql,sql-server,batch-file,Sql,Sql Server,Batch File,我有一个在SQL Server 2017查询窗口中运行良好的脚本。我想使用批处理文件运行脚本,以便将结果导出到文件 我使用批处理文件调用查询时出错。我知道这与Windows DOS如何处理单引号和双引号有关。我已经尝试过在数据和现有的单引号和双引号周围添加单引号和双引号,但是运气不好。我在下面列出了我的批处理文件和我需要运行的查询 批处理内容(第9行是通过调用itemexport.SQL文件执行SQL语句的行) 这是我正在执行的SQL查询。此文件名为itemexport.sql SELECT

我有一个在SQL Server 2017查询窗口中运行良好的脚本。我想使用批处理文件运行脚本,以便将结果导出到文件

我使用批处理文件调用查询时出错。我知道这与Windows DOS如何处理单引号和双引号有关。我已经尝试过在数据和现有的单引号和双引号周围添加单引号和双引号,但是运气不好。我在下面列出了我的批处理文件和我需要运行的查询

批处理内容(第9行是通过调用itemexport.SQL文件执行SQL语句的行)

这是我正在执行的SQL查询。此文件名为itemexport.sql

SELECT 
    ITEM.NAME, UPC, ITEM_DEPARTMENT.NAME AS DEPARTMENT, 
    CAST(ON_HAND_QTY AS decimal(18, 0)) AS "ON HAND QTY", 
    CAST(ITEM.PRICING AS XML).value(N'(/prices[@type="Level"]/item[@level="A"])[1]/@price', N'DECIMAL(14,2)') AS "RETAIL PRICE"
FROM    
    ITEM 
LEFT OUTER JOIN
    ITEM_DEPARTMENT ON ITEM_DEPARTMENT.RECORD_KEY = ITEM.ITEM_DEPARTMENT_RECORD_KEY
WHERE
    (ITEM_DEPARTMENT.NAME IN ('BEER','CIDER','WINE'))
    AND (ITEM.CAN_SELL = 1)
    AND (ON_HAND_QTY > 0)
GROUP BY  
    ITEM.NAME, SKU, UPC, ITEM_DEPARTMENT_RECORD_KEY, 
    ITEM_DEPARTMENT.NAME, ITEM.ON_HAND_QTY, ITEM.PRICING
ORDER BY 
    ITEM_DEPARTMENT.NAME
这是select语句中使用批处理文件时出错的部分

CAST(ITEM.PRICING AS XML).value(N'(/prices[@type="Level"]/item[@level="A"])[1]/@price', N'DECIMAL(14,2)')
这是我收到的错误。。。。 “Msg 102,15级,状态1,服务器BYND5CG8470J1H,第1行 “级别”附近的语法不正确。“


如果我注释掉该cast语句,则会导出项目,但每个项目的“零售价格”列都为空,因为我注释掉的行应该从类似
的行中解析价格

下面是在SQL中运行查询时的输出示例。


如果您能帮助格式化cast语句,我们将不胜感激。

您可以看到,使用参数
-x
禁用变量替换是否有助于sqlcmd(请参阅),但是如果问题仅限于您的cast(parse)语句,您能简单地将其作为UDF并完全绕过错误吗


创建函数parsePrice(@in varchar(max))
将十进制数(14,2)返回为
开始
RETURN CAST(@in为XML).value(N'(/prices[@type=“Level”]/item[@Level=“A”])[1]/@price',N'DECIMAL(14,2)');
结束
然后您的查询就变成

SELECT 
    ITEM.NAME, UPC, ITEM_DEPARTMENT.NAME AS DEPARTMENT, 
    CAST(ON_HAND_QTY AS decimal(18, 0)) AS "ON HAND QTY", 
    dbo.parsePrice(ITEM.PRICING) AS "RETAIL PRICE"
FROM    
    ITEM 
...

我的数据库是MS SQL Server 2017您会遇到什么错误?也许您需要将
sqlcmd
命令行更改为
sqlcmd-S“%~1”-E-i”itemexport.sql“
,并且通常需要将重定向部分更改为
>%bd%\item\u export-%dt%.csv”
…请在您的问题中添加一些信息,描述从批处理文件执行查询时看到的错误类型。这是我得到的错误---Msg 102,级别15,状态1,服务器BYND5CG8470J1H,第1行“级别”附近的语法不正确。如果我注释掉该cast语句,则项目将导出,但“零售价”为每一项的列都是空的,因为我注释掉的行应该从一行中解析价格,就像创建一个解析价格的函数一样。谢谢你的建议。
SELECT 
    ITEM.NAME, UPC, ITEM_DEPARTMENT.NAME AS DEPARTMENT, 
    CAST(ON_HAND_QTY AS decimal(18, 0)) AS "ON HAND QTY", 
    dbo.parsePrice(ITEM.PRICING) AS "RETAIL PRICE"
FROM    
    ITEM 
...