2017-01-19 9 views
0

Microsoft Queryを使用してストアドプロシージャに接続するExcelがあります。ストアドプロシージャLIKEパラメータの操作

私の手順は、次のようになります。

ALTER PROCEDURE [dbo].[WatchDogDataCollector] 
    @websiteID int = NULL, 
    @FailureLogStart datetime = NULL, 
    @FailureLogEnd datetime = NULL 
AS 
    SELECT * 
    FROM WATCHDOG.WatchdogUsr.WebsiteFailureLog 
    WHERE websiteID = ISNULL(@websiteID,websiteID) 
     AND (((FailureLogStart LIKE '%' + ISNULL(@FailureLogStart, FailureLogStart) + '%'))) 
     AND (((FailureLogEnd LIKE '%' + ISNULL(@FailureLogEnd, @FailureLogEnd) + '%'))) 

私の目標は、オプションであるなど持っていなければ日時列FailureLogStart & FailureLogEnd を持つことです。

[Microsfot] [ODBC SQL Serverドライバー] [SQL Server]:一度エクセルに接続されており、私はエラーメッセージが表示されますいくつかの動的パラメータと私のストアドプロシージャを実行しようとしています

これまでのところは良いです変換が失敗したとき チャーター文字列から日付と時刻を変換する

私はよく分からないExcelやSQLで何か問題が起きているのですか?

+0

私は推測している 'FailureLogStart'と' FailureLogEnd'が故に日時ではなく、文字列、あなたの例外です。このクエリの目標は何ですか?いくつかのサンプルデータと望みの結果を加えて、動作するクエリを思いつくことができます。 –

+0

@ ZoharPeledまあ、最終的にユーザーはExcelでいくつかのテキストボックスを持っていて、入力に応じてテーブルをフィルタリングすることができます。たとえば、2016年に入力すると2016を含むデータからすべてを取得します。 –

+0

その場合は、文字列ですが、パラメータの型はdatetime型なので、ユーザが '2016'だけを入力すると、' 2016'を有効なdatetimeに変換しようとすると失敗します。 –

答えて

0

エラーメッセージが表示され、クエリに従うことで、私のようなオペレータが英数字フィルタであるので、それは文字列を取り、すなわち、データ型の不一致があるはずだと思いますタイプ。したがって、これは動作するはずです

ALTER PROCEDURE [dbo].[WatchDogDataCollector] 
    @websiteID int = NULL, 
    @FailureLogStart datetime = NULL, 
    @FailureLogEnd datetime = NULL 
AS 
SELECT 
    * 
FROM 
    WATCHDOG.WatchdogUsr.WebsiteFailureLog 
WHERE 
    websiteID = ISNULL(@websiteID,websiteID) 
    AND (((CONVERT(NVARCHAR(20), FailureLogStart) LIKE '%' + CONVERT(NVARCHAR(20), ISNULL(@FailureLogStart, FailureLogStart)) + '%'))) 
    AND (((CONVERT(NVARCHAR(20), FailureLogEnd) LIKE '%' + CONVERT(NVARCHAR(20), ISNULL(@FailureLogEnd, FailureLogEnd)) + '%'))) 

しかし、これは、datetime列のデータをnvarcharに変換するオーバーヘッドがあります。

代わりに、データ型データをint型にフォーマットして比較することもできます。例えば、 。 SELECT CONVERT(VARCHAR(35)、GETDATE()、112)。 インデックスが作成されていれば、効率的な文字列検索になります。

同様:

ALTER PROCEDURE [dbo].[WatchDogDataCollector] 
    @websiteID int = NULL, 
    @FailureLogStart nvarchar(40) = NULL, -- datetime Changed to allow "2016" in search text box. 
    @FailureLogEnd nvarchar(40) = NULL -- datetime 
AS 

SELECT 
    * 
FROM 
    WATCHDOG.WatchdogUsr.WebsiteFailureLog 
WHERE 
    websiteID = ISNULL(@websiteID,websiteID) 
    AND (((CONVERT(NVARCHAR(35), FailureLogStart, 112) LIKE '%' + CONVERT(NVARCHAR(35), ISNULL(@FailureLogStart, FailureLogStart), 112) + '%'))) 
    AND (((CONVERT(NVARCHAR(35), FailureLogEnd, 112) LIKE '%' + CONVERT(NVARCHAR(35), ISNULL(@FailureLogEnd, FailureLogEnd), 112) + '%'))) 
+0

ありがとう!しかし、私はまだ同じ問題があります。チャーター文字列から日付および/または時刻を変換するときに変換が失敗しました –

+0

私のような述語について私の答えで言及したように、文字列型でなければなりません。したがって、nullでない場合の答えでは、私は今修正した文字列型に変換されませんでした。また、別のサンプルを追加しました。あなたもそれを試すことができます。コメントをつけてくれてありがとう。 –

+0

もう一度ありがとうございます。入力が有効期限であるというメッセージが表示されます。 –

0

はVARCHARのようなパラメータを渡し、彼らは完全な日付ではありませんされています

ALTER PROCEDURE [dbo].[WatchDogDataCollector] @websiteID int = NULL, @FailureLogStart datetime = NULL, @FailureLogEnd datetime = NULL 
AS 
SELECT * 
FROM WATCHDOG.WatchdogUsr.WebsiteFailureLog 
WHERE websiteID = ISNULL(@websiteID,websiteID) 
AND (((cast(FailureLogStart as varchar(50)) like '%'+ISNULL(@FailureLogStart, cast(FailureLogStart as varchar(50)))+'%'))) 
AND (((cast(FailureLogEnd as varchar(50)) like '%'+ISNULL(@FailureLogEnd, cast(FailureLogEnd as varchar(50)))+'%'))) 
+0

まあ、私は正確な日時を知るためにユーザーをexpcできないからです。 –

+0

@ Niko.K部分的な日付を比較できるようにコードを変更しました。 – cloudsafe

+0

お時間を割いていただきありがとうございます!私はまだ同じ問題を抱えています。チャプター文字列から日付と時刻を変換すると変換に失敗しました –

関連する問題