2017-12-28 115 views
0

次のSQLクエリがあります。SQLパラメータの問題

DECLARE @OID NVARCHAR(MAX) = '(98,99,100,101,102,103,104,105)' 

SELECT 
    Name = (SELECT [Name] 
      FROM Point 
      WHERE CAST(OID AS NVARCHAR(10)) = Point), 
    Timestamp, 
    ValueNumeric 
FROM 
    [IngeniousRPM_Bridge].[dbo].[Value] 
WHERE 
    CAST(Point AS NVARCHAR(10)) IN (98,99,100,101,102,103,104,105) 
    AND [Timestamp] BETWEEN '2017-11-01' AND '2017-11-30' 
    AND ValueNumeric IS NOT NULL 

@OIDがハードコーディングされている時には、上記のクエリは正常に動作しますが、私はそれがテーブル内の任意の値を返さない以下のように@OID値を渡すしようとします。最終的には、ストアドプロシージャを作成して@OIDの値を渡す必要があります。あなたがvarchar型の文字列から括弧を削除した場合

DECLARE @OID NVARCHAR(MAX) = '(98,99,100,101,102,103,104,105)' 

SELECT 
    Name = (SELECT [Name] 
      FROM Point 
      WHERE CAST(OID AS NVARCHAR(10)) = Point), 
    Timestamp, 
    ValueNumeric 
FROM 
    [IngeniousRPM_Bridge].[dbo].[Value] 
WHERE 
    CAST(Point AS NVARCHAR(10)) IN (@OID) 
    AND [Timestamp] BETWEEN '2017-11-01' AND '2017-11-30' 
    AND ValueNumeric IS NOT NULL 
+0

これは非標準SQLです。どちらの[DBMS](https://en.wikipedia.org/wiki/DBMS)製品を使用していますか? 「SQL」はクエリ言語であり、特定のデータベース製品の名前ではありません。 –

+1

渡す変数@OIDはvarcharであり、IN句でそのように扱われています。使用しているSQLのバージョンによっては、このスタックオーバーフローの回答が役立ちます。https://stackoverflow.com/questions/29538697/create-t-sql-function-with-table-parameterどのSQLとバージョンを使用しているか知っています。 – SteveB

+0

私はMS SQL Server 2012を使用しています – Learner

答えて

0

あなたが

...私は、現時点ではコメントを追加することはできません。この

SELECT 98 OID, 'Test' OidTest, GETDATE() [TimeStamp] 
INTO #MyTable 

DECLARE @OID nvarchar(MAX)='98,99,100,101,102,103,104,105' 
DECLARE @dyn nvarchar(MAX) 

SELECT @dyn = 'SELECT * FROM #MyTable WHERE OID IN (' + @OID +') and [Timestamp] between ''2017-11-01'' and ''2017-12-30''' 

exec (@dyn) 
-1

ような何かをする必要があり、あなたのパラメータ化バージョンを行います作業?基本的にはあなたが "IN(98,99,100,101,102,103,104,105)"であると思う "IN((98,99,100,101,102,103,104,105))"と言っていますか?

また、特に@OIDの値を受け入れるストアドプロシージャを使用する予定の場合は、連結された文字列を使用しないでください。自分自身をSQLインジェクションの脆弱性にさらしてください。代わりに、ストアドプロシージャ内でsp_executesqlを使用し、パラメータを渡します。コードをコピーすると、次のようになります。

UPDATE:日付パラメータを含むようにクエリを更新しました。

declare @OID nvarchar(MAX)='98,99,100,101,102,103,104,105'; 
declare @sql nvarchar(max); 
declare @startDate datetime; 
declare @endDate datetime; 
SET @sql = N' 
      SELECT Name= (select [Name] from Point where CAST(OID AS 
      NVARCHAR(10)) 
      =Point), 
      Timestamp, 
      ValueNumeric 
      FROM [IngeniousRPM_Bridge].[dbo].[Value] where CAST(Point AS 
      NVARCHAR(10)) 
      In (' + @OID + ') and [Timestamp] between @startDateIN and 
      @endDateIN and 
      ValueNumeric is not null'; 
EXEC sp_executesql @sql 
        ,N'@startDateIN datetime, @endDateIN Datetime' 
        ,@startDateIN = @startDate 
        ,@endDateIN = @endDate; 
+1

これはまったく動作しません。そのようにパラメータを使用することはできません。 – Jonny

+0

はまだ動作しません。 – Learner

+0

非常に良い点...カンマで区切られたリストなので動作しません...クエリを編集しましたが、私のコメントはsp_executesqlを使用しています。特にユーザー入力を解析している場合は特に注意してください。 – DimUser