CORRECÇÃO: A configuração para a precisão e a escala dos dados que são retornados de um procedimento armazenado saída parâmetro é (38,0) quando um valor nulo é retornado no SQL Server 2000

Traduções deste artigo Traduções deste artigo
ID do artigo: 892406 - Exibir os produtos aos quais esse artigo se aplica.
Bug #: 473209 (SQL Server 8.0)
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Suponha que o cenário a seguir: no Microsoft SQL Server 2000, um parâmetro de saída do procedimento armazenado usa um tipo de dados decimal ou um tipo de dados numéricos. Quando é retornado um valor nulo, a configuração para a precisão e a escala dos dados retornados pelo procedimento armazenado saída parâmetro é (38,0) . Essa configuração é mantida em chamadas subseqüentes para o procedimento armazenado. Esse comportamento pode causar dados a ser arredondado para um valor inteiro.

Esse problema se aplica somente a aplicativos que usam o namespace System.Data.SqlClient . Esse problema não afeta aplicativos que usam outro APIs acesso a dados.

Por exemplo, você tem um procedimento armazenado que tem um parâmetro de saída DECIMAL(19,4) . Em seguida, você chamar o procedimento armazenado de um método SqlCommand.ExecuteNonQuery parametrizado.
CREATE PROCEDURE ParameterPrecisionTest(
	@pIn DECIMAL(19,4), 
	@pOut DECIMAL(19,4) OUTPUT) 
AS
	SET @pOut = @pIn
quando você fizer isso, você os seguintes sintomas:
  1. Quando você chamar o método ExecuteNonQuery e definir o parâmetro de saída SqlParameter para 1.5 , 1.5 é retornado.
  2. Quando você chamar o método ExecuteNonQuery e definir o parâmetro de saída SqlParameter para DBNull , System.DBNull é retornado.
  3. Quando você chamar o método ExecuteNonQuery e definir o parâmetro de saída SqlParameter para 1.5 , 2 é retornado.
Observação Na segunda chamada para o procedimento armazenado, a precisão e a escala são redefinidas para (38,0) . Um valor de 2 é retornado na terceira chamada para o procedimento armazenado.

Causa

Esse problema ocorre porque o SQL Server redefine a precisão e a escala para (38,0) quando as seguintes condições forem verdadeiras:
  • Você chama um procedimento armazenado que contém um parâmetro de saída SqlParameter .
  • Defina o parâmetro para DBNull .

Resolução

Informações sobre o service pack

Para resolver esse problema, obtenha o service pack mais recente para o Microsoft SQL Server 2000. Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
290211Como obter o SQL Server 2000 service pack mais recente

Situação

Esse problema foi corrigido primeiro no Microsoft SQL Server 2000 Service Pack 4.

Mais Informações

Etapas para reproduzir o problema

Execute o seguinte código translation from VPE for Csharp Visual.
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();
		}

	}
}
Observação neste exemplo, a segunda chamada para o procedimento armazenado define o parâmetro de saída como DBNull . Portanto, a precisão e a escala são redefinidas para (38,0) . O procedimento armazenado Arredonda o terceiro resultado e, portanto, retorna um valor igual a 2.

Propriedades

ID do artigo: 892406 - Última revisão: sexta-feira, 2 de novembro de 2007 - Revisão: 2.4
A informação contida neste artigo aplica-se a:
  • 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
Palavras-chave: 
kbmt kbbug kbtshoot kbprb kbfix KB892406 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 892406

Submeter comentários

 

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