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

@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 오류를 생성합니다.



답변

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;


답변

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

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


답변

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

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

예를 들어 S를 입력하면

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

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

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

Set @sql =

등호 왼쪽에 있습니다.


답변

이 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;


답변

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

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


답변

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

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”를 선언해야합니다.

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


답변

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

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

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

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