【问题标题】:SQLCMD query - Adding in a products next due date (based on purchase order)SQLCMD 查询 - 在下一个到期日添加产品(基于采购订单)
【发布时间】:2017-03-02 01:34:36
【问题描述】:

我正在使用 .bat 和 SQLCMD 从我的 SQL Server 导出数据。

目前,这就是我所拥有的:

SQLCMD -S <server name> -d <database name> -U <username> -P <password> -Q
"set nocount on;
SELECT T0.ItemCode,
       T0.FrgnName,
       (SELECT cast(round(T3.Price,2,1) as decimal(18,2)) 
        FROM ITM1 T3 
        WHERE T3.ItemCode = T0.Itemcode AND T3.[PriceList] = '1'),
       cast(round(T1.Price,2,1) as decimal(18,2)), 
       CASE WHEN T2.OnHand - T2.IsCommited > 10 THEN '10' ELSE '0' END,
       T0.CodeBars 
FROM OITM T0 
INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode AND T1.[PriceList] = '2' 
INNER JOIN OITW T2 ON T0.ItemCode = T2.ItemCode AND T2.WhsCode = '01. Main' 
WHERE T0.ItemName NOT LIKE '%%DNU%%' 
  AND T0.PrchseItem = 'y' AND T0.FrozenFor = 'n' 
  AND T0.QryGroup2 = 'y' AND T0.QryGroup10 = 'n'"
 -s "," -o "\\serveraddress\stockfile.csv" -h-1 -s"~" -W -w 999

基本上,我需要在库存文件中添加最后一个片段 - 这是 OPOR 表中最早的 DocDueDate。同一产品可能有多个采购订单 - 所以我肯定需要能够获取最早日期的数据。

在我一直在使用的 SAP 和查询中,我似乎无法在 SQLCMD 脚本中实现这一点:

ISNULL((SELECT top 1 r1.[DocDueDate] 
        FROM POR1 r 
        INNER JOIN OPOR r1 ON r.DocEntry = r1.DocEntry  
        WHERE r.[LineStatus] = 'O' 
          AND r.[ItemCode] = T0.[ItemCode] 
        ORDER BY r1.[DocDueDate]), 0) AS 'PO Date'

我试图简单地将它插入到 SQLCMD 脚本中,没有乐趣。然后我尝试剔除 AS 'PO DATE' 但这没有帮助。

我希望有人可以解释为什么这对我不起作用。

问候 瑞克

【问题讨论】:

  • 您在尝试较小的 SAP sn-p 时会收到什么错误?
  • 当我运行 .bat 时它不会显示错误消息 - 它只是闪烁并消失得太快。
  • 在 .bat 的末尾添加 start "" cmd /c "echo QUERY RESULTS!&amp;echo(&amp;pause" 以保持 cmd 窗口屏幕向上。

标签: sql sql-server sqlcmd sapb1


【解决方案1】:

考虑使用聚合查询将内联子查询迁移到派生表以查找最大日期。这避免了逐行运行查询,但只在一次调用中执行:

SELECT T0.ItemCode,
       T0.FrgnName,
       (SELECT CAST(ROUND(T3.Price,2,1) AS DECIMAL(18,2)) 
        FROM ITM1 T3 
        WHERE T3.ItemCode = T0.Itemcode AND T3.[PriceList] = '1'),
       CAST(ROUND(T1.Price,2,1) AS DECIMAL(18,2)), 
       CASE WHEN T2.OnHand - T2.IsCommited > 10 THEN '10' ELSE '0' END,
       T0.CodeBars,
       ISNULL(D.MaxDocDueDate, 0) AS [PO Date]
FROM OITM T0 
INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode AND T1.[PriceList] = '2' 
INNER JOIN OITW T2 ON T0.ItemCode = T2.ItemCode AND T2.WhsCode = '01. Main' 
INNER JOIN
   ( SELECT r.[ItemCode], MAX(r1.[DocDueDate]) As MaxDocDueDate
     FROM POR1 r 
     INNER JOIN OPOR r1 ON r.DocEntry = r1.DocEntry  
     WHERE r.[LineStatus] = 'O' 
     GROUP BY r.[ItemCode]
   ) D ON T0.[ItemCode] = D.[ItemCode]
WHERE T0.ItemName NOT LIKE '%%DNU%%' 
  AND T0.PrchseItem = 'y' AND T0.FrozenFor = 'n' 
  AND T0.QryGroup2 = 'y' AND T0.QryGroup10 = 'n'"

【讨论】:

  • 您的脚本在 SQL Server Management Studio 中运行良好 - 但我有意使用 SQLCMD,以便可以将其作为计划任务运行以导出 CSV。除非您可以向我描述如何使用 Studio 做到这一点,否则我认为我需要坚持使用 SQLCMD。
  • 您是否尝试在 SQLCMD 脚本中运行此查询?这是为了替换 SELECT 语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多