스칼라 변수를 선언해야합니다.


81

@RowFrom int

@RowTo int

저장 프로 시저에 대한 전역 입력 매개 변수이며 T-SQL을 사용하여 저장 프로 시저 내에서 SQL 쿼리를 컴파일 한 다음 저장 프로 시저 Exec(@sqlstatement)의 끝에서 사용 하여 결과를 표시하므로 사용하려고 할 때이 오류가 발생합니다. @RowFrom또는 @RowTo내에서 @sqlstatement실행되는 변수 .. 그것은하시기 바랍니다 도움 .. 잘 달리 작동합니다.

"Must declare the scalar variable "@RowFrom"."

또한 @sqlstatement변수에 다음을 포함 해 보았습니다 .

'Declare @Rt int'
'SET @Rt = ' + @RowTo

그러나 @RowTo여전히 그 값을 전달하지 않고 @Rt 오류를 생성합니다.


5
이 질문에 구체적으로 적용되지 않기 때문에 대답을 추가하지 않을 것이지만이 오류에 대한 Google의 첫 번째 결과 GO로 선언 된 변수가 선언 된 변수가 표시되지 않는 새 분기가 발생 한다는 점에 주목할 가치가 있습니다.
IronSean

답변:


75

int를 문자열에 연결할 수 없습니다. 대신에:

SET @sql = N'DECLARE @Rt int; SET @Rt = ' + @RowTo;

다음이 필요합니다.

SET @sql = N'DECLARE @Rt int; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);

여기서 무슨 일이 일어나고 있는지 설명하기 위해. @RowTo = 5라고합시다.

DECLARE @RowTo int;
SET @RowTo = 5;

DECLARE @sql nvarchar(max);
SET @sql = N'SELECT ' + CONVERT(varchar(12), @RowTo) + ' * 5';
EXEC sys.sp_executesql @sql;

이를 문자열로 만들려면 (궁극적으로 숫자가 되더라도) 변환해야합니다. 그러나 보시다시피 숫자는 실행될 때 여전히 숫자로 취급됩니다. 답은 25입니다. 맞죠?

귀하의 경우에는 @sql 문자열 내에서 @Rt 등을 다시 선언 할 필요가 없으며 다음과 같이 말하면됩니다.

SET @sql = @sql + ' WHERE RowNum BETWEEN ' 
    + CONVERT(varchar(12), @RowFrom) + ' AND ' 
    + CONVERT(varchar(12), @RowTo);

적절한 매개 변수화를 갖는 것이 더 좋을지라도, 예를 들어

SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';

EXEC sys.sp_executesql @sql,
  N'@RowFrom int, @RowTo int',
  @RowFrom, @RowTo;

2
감사합니다.하지만 N '은 무엇을합니까?
청구서

3
@sql변수가 다음과 같이 올바르게 해석 되는지 확인합니다 NVARCHAR.-다음을 사용하는 경우 요구 사항 sp_executesql...
Aaron Bertrand

1
"Where RowNum Between @RowFrom and @RowTo"와 같이 사용되기 때문에 Int 여야합니다. 매개 변수 @ RowFrom / @ RowTo는 int이며 Declared ..
bill

4
네, 이해했습니다. SQL 문자열을 작성하고 있으며 두 수준의 범위에 있습니다. 최상위 수준에서는 문자열을 작성하고 있습니다. 모든 연결은 '5', 'foo'또는 'zuluxxy'여부에 관계없이 문자열 값과 연결되어야합니다. 설명을 위해 예제를 추가하겠습니다.
Aaron Bertrand

10

변수가 a 이전에 선언 GO되고 이후에 참조 되는 경우에도이 오류 메시지를받을 수 있습니다 .

질문 과이 해결 방법을 참조하십시오 .


6

참고로, 이것이 오래된 게시물이라는 것을 알고 있지만 데이터베이스 COLLATION 설정에 따라 다음과 같은 명령문 에서이 오류가 발생할 수 있습니다.

SET @sql = @Sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';

예를 들어 S를 입력하면

SET @sql = @***S***ql 

이미 여기에 게시 된 답변을 분리해서 미안하지만 이것은보고 된 오류의 실제 인스턴스입니다.

또한 오류는 메시지에 대문자 S를 표시하지 않습니다. 이유는 잘 모르겠지만 그 이유는

Set @sql =

등호 왼쪽에 있습니다.


3

이 MSDN 블로그에 따라 맞춤법 오류가 용의자 인 나를 위해 수정 된 것을 추가하십시오 ...

여러 줄에 걸쳐 SQL 문자열을 분할 할 때 SQL 문자열을 매개 변수와 연결하지 않고 쉼표로 구분하고 각 분할 줄의 끝에 공백이 누락되지 않았는지 확인하십시오. 로켓 과학은 아니지만 내가 누군가의 두통을 구하기를 바랍니다.

예를 들면 :

db.TableName.SqlQuery(
    "SELECT Id, Timestamp, User " +
    "FROM dbo.TableName " +
    "WHERE Timestamp >= @from " +
    "AND Timestamp <= @till;" + [USE COMMA NOT CONCATENATE!]
    new SqlParameter("from", from),
    new SqlParameter("till", till)),
    .ToListAsync()
    .Result;

0

대소 문자 구분도이 문제를 유발합니다.

@MyVariable 및 @myvariable은 SQL Server Man에서 동일한 변수입니다. 스튜디오와 작동합니다. 그러나 이러한 변수는 대 / 소문자 구분 차이로 인해 Visual Studio (C #)에서 "스칼라 변수"@MyVariable "을 선언해야합니다."가됩니다.


0

미래의 나를위한 대답입니다 (다른 사람에게도 도움이 될 것입니다!). 쿼리 편집기에서 다음과 같이 실행하려고하면 :

USE [Dbo]
GO

DECLARE @RC int

EXECUTE @RC = [dbo].[SomeStoredProcedure] 
   2018
  ,0
  ,'arg3'
GO

SELECT month, SUM(weight) AS weight, SUM(amount) AS amount 
FROM SomeTable AS e 
WHERE year = @year AND type = 'M'

그리고 오류가 발생합니다.

스칼라 변수 "@year"를 선언해야합니다.

저장 프로 시저 실행 그 아래에 쿼리 (!)를 모두 포함하는 코드를 실행하려고하기 때문 입니다. 실행하려는 항목을 강조 표시하거나 관심이없는 항목을 삭제 / 주석 처리하십시오.


0

여기에 내 SQL 파일이 작동하지 않는 솔루션이없는 동안 다른 사람 이이 질문을 발견하면 내 실수는 다음과 같습니다.

Microsoft의 Server Management Studio의 '스크립트 생성'명령을 통해 내 데이터베이스의 콘텐츠를 내 보낸 다음 생성 된 데이터를 다른 인스턴스에 삽입하면서 나중에 몇 가지 작업을 수행했습니다.

생성 된 내보내기로 인해 SQL 파일에 "GO"문이 많이 있습니다.

내가 몰랐던 것은 파일 상단에 선언 된 변수는 GO 문이 실행되는 한 액세스 할 수 없다는 것입니다. 따라서 내 SQL 파일에서 GO 문을 제거 해야했고 "Must declare the scalar variable xy"오류가 사라졌습니다!


0

이것은 문제 자체에 대한 답이 아닐 가능성이 높지만 검색 할 때 첫 번째 결과로이 질문이 나타납니다. Sql declare scalar variable 오류에 대한 가능한 해결책을 공유합니다.

필자의 경우이 오류는 ;after a SQL 문을 사용하여 발생했습니다 . 제거하면 오류가 사라집니다.

원인은 위의 댓글에 이미 게시 된 @IronSean과 동일하다고 생각합니다.

GO (또는이 경우;)를 사용하면 선언 된 변수가 문을 지나서 보이지 않는 새 분기가 발생한다는 점에 주목할 가치가 있습니다.

예를 들면 :

DECLARE @id int
SET @id = 78

SELECT * FROM MyTable WHERE Id = @var; <-- remove this character to avoid the error message
SELECT * FROM AnotherTable WHERE MyTableId = @var
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.