【发布时间】:2015-07-06 07:33:04
【问题描述】:
我创建了许多存储过程之一作为 ETL 过程的一部分,但存储过程中的一个查询没有执行。
环境是 SQL Server 2012 SP2。
奇怪的是——
运行插入的选择部分(受影响的查询) - 返回行
运行插入(受影响的查询) - 插入行
通过 SSMS 运行整个存储过程 - 插入行
通过 SSIS 运行 - 所有其他查询都会运行,除非关注的问题!
我的存储过程中没有条件,例如如果 x = True 则返回并且其中没有调试代码,例如返回。也没有事务,我正在读取的表是一个由数据流填充的临时表。
查询:
INSERT INTO Person.CustomerLinks
(PersonID, SystemID, CustomerID_bin, CustomerActive)
SELECT i.PersonID
, s.SystemDefID
, i.CustomerID_bin
, 0
FROM Staging.IdentifyOutput i
JOIN Config.SystemDef s ON s.OutputType = i.OutputType
WHERE i.CustomerID_bin IS NOT NULL
AND i.OutputType IN ('L', 'X')
AND i.PersonID > 0
AND i.FileDuplicate = 1
AND i.PreferredRecord = 1
AND NOT EXISTS ( SELECT 1
FROM Person.CustomerLinks cl
WHERE cl.PersonID = i.PersonID
AND cl.CustomerID_bin = i.CustomerID_bin)
该过程有一个 Try Catch 块,该 Catch 将引发错误并且不会引发错误。
过程中唯一的其他非 ETL 代码是 -
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
但是我把它放在这个应用程序的所有过程中,因为我不担心脏读,因为它们不会发生。
我将 tsql 直接放在插入后写入我的审计系统,@@RowCount 为 0。但如果我现在运行 select,我会返回超过 150 万行。
有什么建议吗?
【问题讨论】:
-
可能看起来像一个愚蠢的问题,但连接管理器的用户是否对查询中的所有对象都具有权限?你也可以把它变成它自己的数据流。至少它可以让您看到正在传输的数据。
-
嗨,David,是的,是一个通过凭据和代理对数据库具有几乎完全权限的帐户。不过,如果是权限问题,我希望会引发错误。
-
可能需要分号吗?我有一个带有 try catch 的程序。许多 IF 语句和大约 10 次插入和更新。问题是,“:”去哪里了?在每一行上?例如如果@x = 1;开始;设置@y = 2;结尾;插入 x(字段)值@y;等等?似乎没有这方面的标准
-
SQL Server 不需要分号来处理这些事情。他们不会有任何影响。 Raymondo,您是否尝试过用数据流替换存储过程?您的插入将非常适合一个。我意识到它没有回答为什么 SP 不起作用的问题,但它应该为该问题提供一个可行的解决方案。
标签: stored-procedures sql-server-2012 ssis-2012