【问题标题】:Using sqlcmd with FOR XML returns Invalid Object name 'dbo.Table' yet Query runs in SSMS将 sqlcmd 与 FOR XML 一起使用会返回无效的对象名称“dbo.Table”,但查询在 SSMS 中运行
【发布时间】:2014-01-30 03:15:34
【问题描述】:

这是我的查询:

SELECT title1, 
    [precinct percent] AS [PrecinctPercent], 
    leader, 
    [leader percent] AS [LeaderPercent], 
    Winner, 
    WinningVotes, 
    leader2, 
    [leader2 percent] AS [Leader2Percent], 
    Loser, 
    LosingVotes 
    FROM [leader].dbo.[RACE]  r inner join
     (select rc.[race number],
             max(case when seqnum = 1 then [candidate num] end) as Winner,
             max(case when seqnum = 1 then Votes end) as WinningVotes,
             max(case when seqnum = 2 then [candidate num] end) as Loser,
             max(case when seqnum = 2 then Votes end) as LosingVotes
      from (select rc.*,
                   row_number() over (partition by rc.[race number] order by votes desc) as seqnum
            from [leader].dbo.[RACE CANDIDATES] rc
           ) rc
      group by rc.[race number]
     ) rc
     on r.[race number] = rc.[race number]
     FOR XML PATH ('WQAD'), ROOT('root')

这个查询运行并产生一些我想要的结果。我正在尝试将 XML 文件作为文件输出。我已经能够通过在 Server Management Studio 中打开 xml 来完成此操作,然后运行 ​​VB 脚本来重新生成临时 xml 文件,然后将该 xml 移动到它的目的地。嘿...我必须做我必须做的事情才能在 AIR 上获得这些结果。

在我的旅行中,我尝试使用 sqlcmd 来实现这一点。这是我要运行的内容:

sqlcmd -S WQAD-SEVE\SQLEXPRESS -i C:\Users\localtv\Desktop\QUERIES\THISONE22 .sql -o C:\Users\localtv\Desktop\RESULTS236.xml

它执行,但是当我打开/编辑它输出的 XML 文件时,我得到:

消息 208,级别 16,状态 1,服务器 WQAD-SEVE\SQLEXPRESS,第 1 行 无效的对象名称“dbo.RACE”。

我尝试插入 [database].dbo.RACE,但仍然遇到同样的问题。我已经为此工作了好几个星期,并试图找出一种方法来让它发挥作用。

另外,当我尝试在没有 -o 输出目标的情况下运行命令时,命令行会回显相同的错误消息。从我的查询来看,它在遇到 dbo.RACE 之前完成了相当长的一段时间。

有什么建议吗?

提前感谢您的宝贵帮助。

***我已删除 [databasename] 和 .dbo。同样,仍将 RACE 显示为无效对象。

【问题讨论】:

  • 当它在 SSMS 中运行时,选择 @@ServerName - 确保它是 WQAD-SEVE\SQLEXPRESS?
  • 我已经解决了这个问题。我需要将 -d [databasename] 参数添加到我的 sqlcmd,但是,它不会踢出格式正确的 xml 文件。比如 FOR XML PATH。
  • +1 我刚刚在 SqlExpress 2008R2 上重复了一遍。没有FOR XML PATH 工作正常,FOR XML PATH 给出无效的对象名称“表”。

标签: sql-server sqlcmd for-xml


【解决方案1】:

您已经发现并且我确认了,您需要指定 -d MyDatabaseName 选项。

否则,您将在使用FOR XML PATH 时立即收到invalid object name "Table" 错误,即使您在脚本中添加数据库名称FROM 子句(即,即使FROM Database.dbo.Table 也不会规避这种需要对于-dFOR XML AUTO)。奇怪。

Re:它不会踢出格式正确的 xml 文件

您需要将:XML ON 作为输入 (-i) 文件的第一行添加到sqlcmd

:XML ON
SELECT title1,
 ...

【讨论】:

  • :XML ON.....刚刚度过了我该死的一个月!这会将其输出为我的提要所需的格式。第 2 步(共 10 步)已完成!!! StuartLC....你救了我一瓶 XANAX!是的!!!
  • +1 我相信这个数据库上下文问题会影响所有 XML 方法(例如 FOR XML PATH)但是,像你一样,我无法解释为什么这是真的(就像查询被重新制定以明确忽略表/视图名称上的数据库前缀,并在其他地方运行)。
  • 不过,你用什么版本的 sqlcmd 重现了这个问题?我无法使用 2012 客户端工具。
  • 我认为是 2008R2 - 稍后我回家时会检查。
【解决方案2】:

有点晚了,但在 SQL 脚本中,只需在查询前添加以下内容:

USE dbname;

SELECT ...

【讨论】:

    猜你喜欢
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2011-03-19
    • 1970-01-01
    相关资源
    最近更新 更多