注:パラメータ値の連結及び分割は、最も重要なのは、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
コードを投稿する必要があります。エラーは、あなたの関数が何をしているか(これを最初にチェックするか、その結果を調べるか)、あるいはそれをどのように制限しているかのようです。私は、これらの非常に高速な分割関数の1つを調べます。http://www.sqlservercentral.com/articles/Tally+Table/72993/ – scsimon
split関数の文字列型の出力はありますか?その場合は、戻り値がaか 'a'かどうかを確認してください。 – Drishya1
はいopは文字列型です。私は単に、第3のパラメータを追加することによってどのように問題が引き起こされるのか理解していません。 to ffrom dateはうまくいっていますが、値のリストを持つパラメータを追加してwhere句で使用すると、出力が乱れてしまいます。私はちょうど起こっていることを理解できない – user1768709