2017-11-06 38 views
3

Excel ADOを使用してSQL Server上でストアドプロシージャを実行すると予期しない動作が発生します。ストアドプロシージャには文字列パラメータがあります。 spのパラメータが短すぎると、4 milion文字を四捨五入するとすべて正常に動作します。Excel ADO接続を介してパラメーターを使用してストアドプロシージャを実行する場合の制限

文字列パラメータがe.iの場合に問題が発生します。 9百万の文字。 私は、SPの冒頭にこのコードでパラメータを取り込むよう間違いなくADOは、SQLサーバーに突き刺すことが可能と判断した:

create procedure MyStoredProcedure(@String nvarchar(max)) 
as 
if OBJECT_ID('dbo.temp', 'U') is not null drop table dbo.temp; 
select [String][email protected] into dbo.temp 

しかし、パラメータはエクセルADOを介して呼び出され、SPでさらに処理することができません。詳細なspは重要ではないかもしれませんが、ちょうどStackoverflowで答えがhereで提示されているかもしれません。 SSMSからこのように呼び出すことができるので、sp自体は大丈夫です。

declare @String nvarchar(max) 
set @String=(select top 1 [String] from dbo.temp); 
exec dbo.MyStoredProcedure @String 

このクエリはパラメータサイズに制限なく正しく実行されます。

Excel ADOのようなパラメータの長さ制限、クエリ制限、制限時間によるストアドプロシージャの実行には制限がありますか。

+1

別のテクニックを使うと効果的かもしれませんが、実際に何をしようとしているのかを特定する別の質問をしたり、いくつかの調査を行います。多くのETLツールがあり、Excelを開いた状態で実行する必要があるか、スケジュールされた負荷を使うことができるか、またはさまざまな回答がたくさんあります。 9百万文字は、SQLサーバーに渡すための大幅なサイズのパラメータです。また、あなたの他の質問は、文字列を分割することであり、これはSTRING_SPILT()関数を持つタグ付きSQL 2016です。https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact- SQL – Matt

答えて

0

それを実証しました。私はVBAエラートラップでオプションBreak on all errorsをオンにしています。エラーメッセージはRun-time error '-2147217908 (80040e31)'でした。私は、タイムアウトのデフォルト値は30秒​​でなければならないと思います。 ADO接続を介して実行されるクエリは、パラメータ文字列の長さが9ミリオン文字を超えると、その時間を超えます。私はちょうど120秒にタイムアウトを設定し、問題は解決されました。

Dim cmd As Object 
Set cmd = CreateObject("ADODB.Command") 
    cmd.CommandTimeout = 120 'This line solved the problem 

とにかく、ADO接続の制限、デフォルト値が設定されていても、それらの制限のリストを知っていることはまだ価値があります。

関連する問題