如何将可为空的guid声明为带有SQL Server的C#CLR存储过程的可选参数

Col*_*lty 12 c# sql-server stored-procedures guid optional-parameters

我正在编写一个部署在SQL Server 2008 R2(即.Net 3.5)上的C#存储过程,并希望将可选参数声明为可以为空的guid.这是我先尝试过的:

[Microsoft.SqlServer.Server.SqlProcedure]
public static void spCalcPerc(
     SqlGuid pID
    , SqlGuid sID = DBNull.Value
    )
Run Code Online (Sandbox Code Playgroud)

这与编译时错误失败:

'sID'的默认参数值必须是编译时常量

这是因为DBNull.Value不是一个常数,这是一种痛苦.

所以我尝试将声明更改为:

[Microsoft.SqlServer.Server.SqlProcedure]
public static void spCalcPerc(
     SqlGuid pID
    , Guid? sID = null
    )
Run Code Online (Sandbox Code Playgroud)

这编译但现在我得到这个部署错误:

部署错误:无法为参数System.Nullable创建类型

试:

, SqlGuid sID = null
Run Code Online (Sandbox Code Playgroud)

给出了这个编译时错误:

类型为"<null>"的值不能用作默认参数,因为没有标准转换来键入"System.Data.SqlTypes.SqlGuid"

所以感觉相当困难我采取了这个:

, SqlGuid sID = "00000000-0000-0000-0000-000000000000"
Run Code Online (Sandbox Code Playgroud)

我不想做的,因为在代码中测试该字符串感觉就像一个kludge.但是,这不起作用,因为我得到这个编译错误:

"string"类型的值不能用作默认参数,因为没有标准转换来键入"System.Guid"

Gah,4种不同的方法,但都不起作用.

非常感谢您的想法或推动正确的方向.

Mik*_*Vee 0

只为您想要默认的值传递 Null 是否有问题?
当然这可能并不适用于所有情况。
有时您可能想知道实际值是否确实为 Null,因此避免使用默认值。
如果是这种情况,那么我会添加一个额外的“默认”参数。

[Microsoft.SqlServer.Server.SqlProcedure]
public static void MySproc(SqlGuid pID, SqlGuid sID, SqlBoolean UseDefault_sID)
{
    sID = (UseDefault_sID == SqlBoolean.True && sID == SqlGuid.Null)
        ? SomeDefaultPIDValue : sID;
}
Run Code Online (Sandbox Code Playgroud)

这样就不必编写额外的“包装器”存储过程来接受带有默认值的可选参数,然后调用 CLR 存储过程。

传入 Null 时使用默认值:UseDefault_pID = 1
传入 Null 时保留实际值:UseDefault_pID = 0