2016-09-01 7 views
0

こんにちは私は、@Startdateと@Enddateの2つのパラメータを持つストアドプロシージャを持っています。プロシージャを実行すると、データが取得されます。問題を引き起こすパラメータの追加 - データが表示されない

ここでパラメータを追加しました。値のリストがあります。だから私は分割関数を追加し、WHERE節に追加しました。今私のSPを実行するときに変更を加えた後、私はデータを取得しません。私はWHERE句から3番目のパラメータをコメントアウトしようとしましたが、今度はデータが再び表示されます。何が起こっているのか分かりません。アドバイスをいただければ幸いです。

私はさまざまな分割機能を試しており、Charindex(','+cast(tableid as varchar(8000))+',', @Ids) > 0と何も機能していません。 おかげ

+3

コードを投稿する必要があります。エラーは、あなたの関数が何をしているか(これを最初にチェックするか、その結果を調べるか)、あるいはそれをどのように制限しているかのようです。私は、これらの非常に高速な分割関数の1つを調べます。http://www.sqlservercentral.com/articles/Tally+Table/72993/ – scsimon

+0

split関数の文字列型の出力はありますか?その場合は、戻り値がaか 'a'かどうかを確認してください。 – Drishya1

+0

はいopは文字列型です。私は単に、第3のパラメータを追加することによってどのように問題が引き起こされるのか理解していません。 to ffrom dateはうまくいっていますが、値のリストを持つパラメータを追加してwhere句で使用すると、出力が乱れてしまいます。私はちょうど起こっていることを理解できない – user1768709

答えて

0

注:パラメータ値の連結及び分割は、最も重要なのは、SQL injection攻撃の影響を非常に受けやすく、パフォーマンス上の理由から、貧弱なデザインです。いくつかの選択肢を調査してください。このパスを進む必要がある場合...

そこには非常に多くの分割機能がありますが、私はこの1つを使用して可能な解決策を説明します。hereあなたはint型、varchar型または利用可能なさまざまな他のデータ型に基づいて検索結果をフィルタリングする必要がありますが、ここでは2つの選択肢(そしておそらく最も一般的)である場合に

CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
     IF @end = 0 
      SET @end = LEN(@string) + 1 

     INSERT INTO @output (splitdata) 
     VALUES(SUBSTRING(@string, @start, @end - @start)) 
     SET @start = @end + 1 
     SET @end = CHARINDEX(@delimiter, @string, @start) 
    END 
RETURN 
END 
GO 

それは、あなたの質問から、不明です。

DECLARE @TableOfData TABLE 
    (
     ID_INT INT, 
     ID_VAR VARCHAR(100), 
     START_DATE DATETIME, 
     END_DATE DATETIME 
    ) 

DECLARE @StartDate DATETIME 
DECLARE @EndDate DATETIME 
DECLARE @Ids VARCHAR(1000) 
DECLARE @Delimiter VARCHAR(1) 
SET @Delimiter = ',' 

SET @StartDate = GETDATE() 
SET @EndDate = DATEADD(HH, 1, GETDATE()) 
SET @Ids = '1,2,4' 

--Create some test data 
INSERT INTO @TableOfData 
    SELECT 1, '1', GETDATE(), DATEADD(MI, 1, GETDATE()) --In our window of expected results (date + id) 
    UNION SELECT 2, '2', GETDATE(), DATEADD(D, 1, GETDATE()) --NOT in our window of expected results b/c of date 
    UNION SELECT 3, '3', GETDATE(), DATEADD(MI,2, GETDATE()) --NOT in our expected results (id) 
    UNION SELECT 4, '4', GETDATE(), DATEADD(MI,4, GETDATE()) --In our window of expected results (date + id) 

--If querying by string, expect 2 results 
SELECT TD.* 
    FROM @TableOfData TD 
     INNER JOIN dbo.fnSplitString(@Ids, @Delimiter) SS 
      ON TD.ID_VAR = SS.splitdata 
    WHERE START_DATE >= @StartDate 
    AND END_DATE <= @EndDate 

--If querying by int, expect 2 results 
SELECT TD.* 
    FROM @TableOfData TD 
     INNER JOIN dbo.fnSplitString(@Ids, @Delimiter) SS 
      ON TD.ID_INT = CONVERT(int, SS.splitdata) 
    WHERE START_DATE >= @StartDate 
    AND END_DATE <= @EndDate 
+0

ありがとうsqlは "無効なcolumnnmae" splitdata "エラーを取得しています – user1768709

+0

あなたのパラメータとspltidata関数を共有してください、私はその情報を手助けすることができるかもしれません – SqlOnly

0

クエリフィルタで直接リストにパラメータを使用することはできません。テーブル変数またはテンポラリテーブルに分離したデータを格納し、クエリでそのデータを呼び出すか、テーブル変数またはテンポラリテーブルを使用しない場合は、動的SQLを使用してクエリを記述してください。

+0

OPは、 – scsimon