在 Management Studio 中编辑后 SQL Server 视图不起作用
Posted
技术标签:
【中文标题】在 Management Studio 中编辑后 SQL Server 视图不起作用【英文标题】:SQL Server view not working after edit in Management Studio 【发布时间】:2011-09-14 11:15:58 【问题描述】:我有一个有效的视图,我在 SQL Server Mgmt Studio 中对其进行了编辑,但它不起作用,我取出更改并将其保存下来,尽管将其恢复到原始状态,它仍然不起作用。
我收到了错误
不能在包含外连接的查询中指定连接的表 运营商。视图或函数“adept_invoiced”包含联接表。
由于视图是在 2001 年编写的,并且我尝试在 Management Studio 中编辑它(第一次),我四处搜索并想出了一个可能的连接语法问题。
这个视图运行了好几年,直到今天早上我对其进行了编辑。
这是 From/Where 部分....
FROM dbo.SYS_COMP_ADDRESS
CROSS JOIN dbo.SL_ACCOUNTS
INNER JOIN dbo.SL_TRANSACTIONS
INNER JOIN dbo.ORD_HEADER
ON dbo.SL_TRANSACTIONS.ST_ORDER_NUMBER =
dbo.ORD_HEADER.OH_ORDER_NUMBER
INNER JOIN dbo.SL_PL_NL_DETAIL
LEFT OUTER JOIN dbo.STK_STOCK
ON dbo.SL_PL_NL_DETAIL.DET_STOCK_CODE =
dbo.STK_STOCK.STKCODE
INNER JOIN dbo.ORD_DETAIL
ON dbo.SL_PL_NL_DETAIL.DET_ORDER_LINK =
dbo.ORD_DETAIL.OD_PRIMARY
LEFT OUTER JOIN dbo.STK_STOCK3
ON dbo.SL_PL_NL_DETAIL.DET_STOCK_CODE =
dbo.STK_STOCK3.STKCODE3
LEFT OUTER JOIN dbo.STK_STOCK_2
ON dbo.SL_PL_NL_DETAIL.DET_STOCK_CODE =
dbo.STK_STOCK_2.STKCODE2
LEFT OUTER JOIN dbo.PRC_PRICE_RECS2
ON dbo.SL_PL_NL_DETAIL.DET_PRICE_CODE =
dbo.PRC_PRICE_RECS2.PRCODE2
ON dbo.SL_TRANSACTIONS.ST_HEADER_KEY =
dbo.SL_PL_NL_DETAIL.DET_HEADER_KEY
ON dbo.SL_ACCOUNTS.CUCODE = dbo.SL_TRANSACTIONS.ST_COPYCUST
INNER JOIN dbo.SL_ACCOUNTS2
ON dbo.SL_ACCOUNTS.CUCODE = dbo.SL_ACCOUNTS2.CUCODE2
WHERE ( dbo.SL_TRANSACTIONS.ST_TRANTYPE IN ( 'INV', 'CRN' ) )
AND ( dbo.SL_TRANSACTIONS.ST_BATCH_FLAG <> 1 )
AND ( dbo.SL_ACCOUNTS.CUCODE <> '1023134' )
AND ( dbo.SL_ACCOUNTS.CUCODE <> '1023265' )
AND ( dbo.SL_ACCOUNTS.CUSORT NOT LIKE '%other income%' )
AND ( dbo.SL_ACCOUNTS.CUSORT NOT LIKE '%supplier%' )
我不确定它可能在哪里失败,或者如何解决它!
任何帮助将不胜感激。
【问题讨论】:
+1 只是因为我从未听说过这个错误!你有 3 个连续的JOIN
条件就在最后一个 LEFT OUTER JOIN
下是故意的吗?除非你能告诉我们语义应该是什么,否则我们无法告诉你正确的语法。
你从哪里得到这个错误?这听起来不像是 SQL Server 错误,所以大概不是直接来自查询 SSMS 中的视图?
@Damien Msg 4424 select * from sys.messages where text like '%Joined tables cannot be specified%'
我建议您以后不要以这种方式编辑视图 - 在 2008+ 版本的 Management Studio 中,您可以选择 modify
,这只是让您可以使用一个普通的查询窗口,没有任何 SSMS“助手”功能、包袱和随之而来的错误......
我发现只有当我从使用 Union All 从多个相同数据库中提取相同信息的视图访问此视图时才会出现问题。
【参考方案1】:
试试这个:
FROM dbo.SYS_COMP_ADDRESS
CROSS JOIN dbo.SL_ACCOUNTS
INNER JOIN dbo.SL_TRANSACTIONS
INNER JOIN dbo.ORD_HEADER
ON dbo.SL_TRANSACTIONS.ST_ORDER_NUMBER =
dbo.ORD_HEADER.OH_ORDER_NUMBER
INNER JOIN dbo.SL_PL_NL_DETAIL
ON dbo.SL_TRANSACTIONS.ST_HEADER_KEY =
dbo.SL_PL_NL_DETAIL.DET_HEADER_KEY
LEFT OUTER JOIN dbo.STK_STOCK
ON dbo.SL_PL_NL_DETAIL.DET_STOCK_CODE =
dbo.STK_STOCK.STKCODE
INNER JOIN dbo.ORD_DETAIL
ON dbo.SL_PL_NL_DETAIL.DET_ORDER_LINK =
dbo.ORD_DETAIL.OD_PRIMARY
LEFT OUTER JOIN dbo.STK_STOCK3
ON dbo.SL_PL_NL_DETAIL.DET_STOCK_CODE =
dbo.STK_STOCK3.STKCODE3
LEFT OUTER JOIN dbo.STK_STOCK_2
ON dbo.SL_PL_NL_DETAIL.DET_STOCK_CODE =
dbo.STK_STOCK_2.STKCODE2
LEFT OUTER JOIN dbo.PRC_PRICE_RECS2
ON dbo.SL_PL_NL_DETAIL.DET_PRICE_CODE =
dbo.PRC_PRICE_RECS2.PRCODE2
ON dbo.SL_ACCOUNTS.CUCODE = dbo.SL_TRANSACTIONS.ST_COPYCUST
INNER JOIN dbo.SL_ACCOUNTS2
ON dbo.SL_ACCOUNTS.CUCODE = dbo.SL_ACCOUNTS2.CUCODE2
WHERE ( dbo.SL_TRANSACTIONS.ST_TRANTYPE IN ( 'INV', 'CRN' ) )
AND ( dbo.SL_TRANSACTIONS.ST_BATCH_FLAG <> 1 )
AND ( dbo.SL_ACCOUNTS.CUCODE <> '1023134' )
AND ( dbo.SL_ACCOUNTS.CUCODE <> '1023265' )
AND ( dbo.SL_ACCOUNTS.CUSORT NOT LIKE '%other income%' )
AND ( dbo.SL_ACCOUNTS.CUSORT NOT LIKE '%supplier%' )
【讨论】:
移动ON
子句会改变查询的语义。
这似乎可行,谢谢。尽管从另一个视图访问该视图时我仍然遇到类似的错误,该视图使用联合连接来自不同数据库的相同视图。【参考方案2】:
您是否在任何地方使用旧式连接语法,因此请在您的视图定义中搜索 *=
和 =*
【讨论】:
我只在case语句中使用'='.....我会发布整个脚本,但它很长! 我的帖子似乎去掉了星号(=, =) @SPE109 -*
中的内容斜体 或**
中的粗体。用反引号将其包围以将其视为代码。以上是关于在 Management Studio 中编辑后 SQL Server 视图不起作用的主要内容,如果未能解决你的问题,请参考以下文章
SQL Management Studio 在脚本创建后无法识别表存在
在 sql 2008 management studio 中编辑 DTS 包
如何在 SQL Server Management Studio 中编辑结果网格中的数据
SQL Server Management Studio 查询中使用 SQLCMD 模式