FIX: 정밀도와 배율이 저장된 프로시저에서 반환된 데이터의 대한 설정이 매개 변수는 null 값을 SQL Server 2000에서 반환될 때 38,0 출력

기술 자료 번역 기술 자료 번역
기술 자료: 892406 - 이 문서가 적용되는 제품 보기.
# 버그: 473209 (SQL Server 8.0)
모두 확대 | 모두 축소

이 페이지에서

현상

다음 시나리오를 가정해: Microsoft SQL Server 위치 2000, 저장된 프로시저 출력 매개 변수를 10진수 데이터 형식 또는 숫자 데이터 형식을 사용합니다. null 값이 반환되면 정밀도와 배율이 저장된 프로시저에서 반환된 데이터 설정을 매개 변수 (38,0) 출력. 이 설정은 후속 호출에 대한 저장된 프로시저가 유지됩니다. 정수 값을 반올림할 데이터를 이 동작이 발생할 수 있습니다.

이 문제는 System.Data.SqlClient 네임스페이스를 사용하는 응용 프로그램에만 적용됩니다. 이 문제는 다른 데이터 액세스 API를 사용하는 응용 프로그램에 영향을 주지 않습니다.

예를 들어, DECIMAL(19,4) 출력 매개 변수가 있는 저장된 프로시저가 있습니다. 그런 다음 매개 변수가 있는 SqlCommand.ExecuteNonQuery 메서드에서 다음 저장된 프로시저를 호출합니다.
CREATE PROCEDURE ParameterPrecisionTest(
	@pIn DECIMAL(19,4), 
	@pOut DECIMAL(19,4) OUTPUT) 
AS
	SET @pOut = @pIn
이 작업을 수행할 때 다음 현상이:
  1. 1.5는 ExecuteNonQuery 메서드를 호출할 수 1.5SqlParameter 출력 매개 변수를 설정할 때 반환됩니다.
  2. System.DBNull은 ExecuteNonQuery 메서드를 호출하고 DBNullSqlParameter 출력 매개 변수를 설정할 때 반환됩니다.
  3. 2는 ExecuteNonQuery 메서드를 호출할 수 1.5SqlParameter 출력 매개 변수를 설정할 때 반환됩니다.
참고 저장된 프로시저가 두 번째 호출은 정밀도 및 배율 (38,0) 로 다시 설정됩니다. 값이 2 저장된 프로시저가 세 번째 호출에서 반환됩니다.

원인

다시 다음 조건에 해당하는 경우 SQL Server 정밀도 및 배율 (38,0) 로 설정되기 때문에 이 문제가 발생합니다.
  • SqlParameter 출력 매개 변수를 포함하는 저장된 프로시저를 호출합니다.
  • DBNull 로 매개 변수를 설정합니다.

해결 방법

서비스 팩 정보

이 문제를 해결하려면 Microsoft SQL Server 2000의 최신 서비스 팩을 구하십시오. 추가 정보는 다음 문서 번호를 클릭하여 Microsoft 기술 자료에서 확인하십시오:
290211최신 SQL Server 2000 서비스 팩을 구하는 방법

현재 상태

이 문제는 Microsoft SQL Server 2000 서비스 팩 4에서 처음 수정되었습니다.

추가 정보

문제를 재현하는 방법

다음 C# 코드를 실행하십시오.
using System;
using System.Data.SqlClient;
using System.Data;

namespace MyApplication
{
	/// <summary>
	/// Summary description for Class1.
	/// </summary>
	class MyClass
	{
		/// <summary>
		/// The main entry point for the application.
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
			
			string strConn = "Server=(local);Database=Northwind;" + 
				"Trusted_Connection=Yes;";
			SqlConnection cn = new SqlConnection(strConn);

			// Create stored procedure.
			PrepDb(cn);

			// Simple stored procedure.
			//    Input and output parameters decimal(19, 4).
			//    Sets the output parameter value to the input parameter value.
			SqlCommand cmd = cn.CreateCommand();
			cmd.CommandText = "ParameterPrecisionTest";
			cmd.CommandType = CommandType.StoredProcedure;
			SqlParameter pIn = cmd.Parameters.Add("@pIn", SqlDbType.Decimal);
			pIn.Precision = 19;
			pIn.Scale = 4;
			SqlParameter pOut = cmd.Parameters.Add("@pOut", SqlDbType.Decimal);
			pOut.Precision = 19;
			pOut.Scale = 4;
			pOut.Direction = ParameterDirection.Output;

			cn.Open();

			// Print value, precision, and scale for the output parameter.
			CheckParameter("Pre-execution", pOut);

			// The first call to the procedure returns 1.5.
			pIn.Value = 1.5;
			cmd.ExecuteNonQuery();
			CheckParameter("Returning 1.5", pOut);

			// The second call to the procedure returns null.
			pIn.Value = DBNull.Value;
			cmd.ExecuteNonQuery();
			CheckParameter("Returning DBNull", pOut);

			// The third call to the procedure returns 2.
			pIn.Value = 1.5;
			cmd.ExecuteNonQuery();
			CheckParameter("Returning 1.5", pOut);

			cn.Close();
		}
		static void CheckParameter(string Message, IDbDataParameter Parameter)
		{
			Console.WriteLine("\t{0}", Message);
			Console.WriteLine("\t\tValue:{0}\tPrecision:{1}\tScale:{2}", 
				(Parameter.Value != DBNull.Value) ? Parameter.Value : "DBNull", 
				Parameter.Precision, Parameter.Scale);
			Console.WriteLine();
		}

		static void PrepDb(IDbConnection Connection)
		{
			IDbCommand cmd = Connection.CreateCommand();
			Connection.Open();
			cmd.CommandText = "DROP PROCEDURE ParameterPrecisionTest";
			try {cmd.ExecuteNonQuery();} 
			catch {}
			cmd.CommandText = "CREATE PROCEDURE ParameterPrecisionTest " +
				"(@pIn decimal(19, 4), @pOut decimal(19, 4) OUTPUT) " +
				"AS SET @pOut = @pIn";
			cmd.ExecuteNonQuery();
			Connection.Close();
		}

	}
}
참고 예제에서는 두 번째 호출은 저장 프로시저의 출력 매개 변수 DBNull 로 설정합니다. 따라서, 정밀도 및 배율 (38,0) 로 다시 설정됩니다. 저장된 프로시저가 세 번째 결과를 반올림합니다. 그리고 따라서 2 값을 반환합니다.

속성

기술 자료: 892406 - 마지막 검토: 2007년 11월 2일 금요일 - 수정: 2.4
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Workgroup Edition
  • Microsoft SQL Server 2000 Desktop Engine (Windows)
  • Microsoft SQL Server 2000 Enterprise Edition 64-bit
키워드:?
kbmt kbbug kbtshoot kbprb kbfix KB892406 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com