私は、カンマで区切られた文字列を受け取り、そのキーを持つレコードが正しい状態であることを確認する非常に簡単なチェック手順を持っています。この手順の最後に、カンマで区切られた文字列、文字列内の項目の数、および更新の数で監査が作成されます。監査には常に0アップデートが反映されます。しかし、プロシージャを実行するジョブと同じログインでSSMSでプロシージャを実行すると、更新が得られます。私は何かが起こっているが、それを見ることはできないことを知っている。ルーチンは以下のように指定されていますストアドプロシージャはSSMSでのみ完全に動作します
BEGIN
SET NOCOUNT ON;
declare @loads Table(shipmentnumber varchar(20))
declare @passinfo Table (ID int, fieldname varchar(50), field nvarchar(max))
select @info = replace(@info, '"','')
declare @cnt1 int, @cnt2 int, @error varchar(100)
insert into @loads
select rtrim(ltrim(splitdata)) from dbo.fnsplitstring(@info, ',')
set @cnt1 = @@rowcount
update loads
set loadstatus = 102
where shipmentnumber in (select shipmentnumber from @loads)
and loadstatus <> 102
set @cnt2 = @@rowcount
INSERT INTO [dbo].[ShipperSPAudit]
([SP]
,[parm1]
,[parm2],parm3,parm4
,[requesteddate]
, userid)
VALUES
('CPCheckCancel'
,cast(@shipper as varchar)
,@info, cast(@cnt1 as varchar), cast(@cnt2 as varchar)
,getdate()
,@userid)
END
[習慣が悪い:VARCHARを宣言しない(長さ)](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09) /bad-habits-to-kick-declaring-varchar-without-length.aspx) - **常に**使用する 'varchar'変数とパラメータの長さを指定してください** –
疑問がたくさんあります。より長いスクリプト/プロシージャの一部を投稿しただけです。あなたはpassinfoを宣言しますが、決してそれを使用しません。あなたは荷送人を使用しますが(キャスティングは不十分ですが)、宣言しません。問題は他の場所にある可能性が高い。あなたがそれを消毒する前と後に情報の内容を比較することから始めます。このプロシージャを呼び出すことによって、期待どおりの情報が提供されないこともあります。もちろん、このプロシージャを直接実行するときに実行します。 – SMor
唯一欠けている行は – Pat