2017-10-22 12 views
0

私は、カンマで区切られた文字列を受け取り、そのキーを持つレコードが正しい状態であることを確認する非常に簡単なチェック手順を持っています。この手順の最後に、カンマで区切られた文字列、文字列内の項目の数、および更新の数で監査が作成されます。監査には常に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 
+2

[習慣が悪い:VARCHARを宣言しない(長さ)](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09) /bad-habits-to-kick-declaring-varchar-without-length.aspx) - **常に**使用する 'varchar'変数とパラメータの長さを指定してください** –

+0

疑問がたくさんあります。より長いスクリプト/プロシージャの一部を投稿しただけです。あなたはpassinfoを宣言しますが、決してそれを使用しません。あなたは荷送人を使用しますが(キャスティングは不十分ですが)、宣言しません。問題は他の場所にある可能性が高い。あなたがそれを消毒する前と後に情報の内容を比較することから始めます。このプロシージャを呼び出すことによって、期待どおりの情報が提供されないこともあります。もちろん、このプロシージャを直接実行するときに実行します。 – SMor

+0

唯一欠けている行は – Pat

答えて

0

なぜSSMSで動作するのか、スケジュールされた仕事ではないのか合理的な説明はありません。 dbo.fnsplitstring(@info、 '、')から部分文字列(splitdata、1,8)を選択するために、dbo.fnsplitstring(@info、 '、')からselect rtrim(ltrim(splitdata)コンマで区切られたフィールドの長さは8文字にする必要があります。このコードは、ジョブとして実行され、SSMSで実行されているときに機能するようになりました。

+0

です。理論 - 外部システムからのデータはスペース以外のもので埋められていたので、rtrimとltrimは効果がありませんでした。データは、varchar(max)フィールドの監査テーブルに格納されました。したがって、特殊文字は失われ、SSMSで使用するためにデータが取得されたとき、rtrimとltrimは機能しました – Pat

関連する問題