2017-12-28 70 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,100101102103104105))"라고 말하면서, 내가 원하는 것은 "IN (98,99,100101102103104105)"입니다.

또한, 특히 @OID 값을 허용하는 저장 프로 시저를 사용하려는 경우 연결된 SQL 문을 사용하지 않을 것입니다. 대신 저장 프로 시저 내에서 sp_executesql을 사용하고 매개 변수를 전달하십시오. 코드를 복사하면 다음과 같이 보입니다.

업데이트 : 날짜 매개 변수를 포함하도록 쿼리를 업데이트했습니다.

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