存储过程默认值

问题描述:

当谈到SQL时,我是一名新手。当创建一个参数存储过程如下:存储过程默认值

@executed   bit, 
@failure   bit, 
@success   bit, 
@testID    int, 
    @time    float = 0, 
@name    varchar(200) = '', 
@description  varchar(200) = '', 
@executionDateTime nvarchar(max) = '', 
@message   nvarchar(max) = '' 

这是T-SQL默认值的正确形式吗?我试图使用NULL而不是''。

当我试图通过C#执行此过程时出现一个错误,指的是预期的描述,但未提供。当这样调用时:

 cmd.Parameters["@description"].Value = result.Description; 

result.Description为null。如果这不是在SQL中默认为NULL(在我的情况“现在好”)?

这里的调用命令:

 cmd.CommandText = "EXEC [dbo].insert_test_result @executed, 
          @failure, @success, @testID, @time, @name, 
          @description, @executionDateTime, @message;"; 

     ... 
     cmd.Parameters.Add("@description", SqlDbType.VarChar); 
     cmd.Parameters.Add("@executionDateTime", SqlDbType.VarChar); 
     cmd.Parameters.Add("@message", SqlDbType.VarChar); 

     cmd.Parameters["@name"].Value = result.Name; 
     cmd.Parameters["@description"].Value = result.Description; 
     ... 

     try 
     { 
      connection.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
     ... 
     finally 
     { 
      connection.Close(); 
     } 

一个更好的方法是改变在CommandText只是SP的名称,并且将CommandType为StoredProcedure - 那么参数将工作更加干净:

cmd.CommandText = "insert_test_result"; 
cmd.CommandType = CommandType.StoredProcedure; 

这也允许更简单的名称传递,而不是位置。

一般来说,ADO.NET需要DBNull.Value,而不是null。我只是用那些遍历我指定参数和使用DBNull.Value替换所有空值的方便的方法 - 就这么简单(包装):

foreach (IDataParameter param in command.Parameters) 
    { 
     if (param.Value == null) param.Value = DBNull.Value; 
    } 

但是!使用null指定值不同于让它假定默认值。如果您希望它使用默认值,请不要在命令中包含参数。

如果您没有使用命名参数,MSSQL将按收到的顺序(按索引)获取参数。我认为在cmd对象上有这个选项。

所以你的SQL应该更像

EXEC [dbo].insert_test_result 
@executed = @executed, 
@failure = @failure, 
@success = @success, 
@testID = @testID, 
@time = @time, 
@name = @name, 
@description = @description, 
@executionDateTime = @executionDateTime, 
@message = @message; 
+0

容易,只需设置的CommandType到存储过程和CommandText中为 “insert_test_result”,虽然。 – 2008-09-30 21:09:40


cmd.CommandText = "insert_test_result"; 
cmd.Parameters.Add(new SQLParameter("@description", result.Description)); 
cmd.Parameters.Add(new SQLParameter("@message", result.Message)); 
try 
{ 
    connection.Open(); 
    cmd.ExecuteNonQuery(); 
} 
finally 
{ 
    connection.Close(); 
}