Подтвердить что ты не робот

Как объявить nullable guid в качестве необязательного параметра для хранимой процедуры С# CLR с SQL Server

Я пишу хранимую процедуру С#, которая развернута на SQL Server 2008 R2 (так .Net 3.5) и хочу объявить необязательный параметр как nullable guid. Вот что я пробовал первым:

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

Это не удалось с ошибкой времени компиляции:

Значение параметра по умолчанию для 'sID' должно быть константой времени компиляции

потому что DBNull.Value не является константой, которая является болью.

Поэтому я попытался изменить объявление на:

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

Это компилируется, но теперь я получаю эту ошибку развертывания:

Ошибка развертывания: не удалось создать тип для параметра System.Nullable

Попытка:

, SqlGuid sID = null

Дает эту ошибку времени компиляции:

Значение типа '<null> 'не может использоваться как параметр по умолчанию, потому что нет стандартных преобразований для типа 'System.Data.SqlTypes.SqlGuid'

Так что, чувствуя себя довольно застрявшим, я прибегал к этому:

, SqlGuid sID = "00000000-0000-0000-0000-000000000000"

Что я не хотел делать, так как тестирование этой строки в коде выглядит как kludge. Однако это не работает, поскольку я получаю эту ошибку компиляции:

Значение типа 'string' не может использоваться как параметр по умолчанию, потому что нет стандартных преобразований для типа 'System.Guid'

Gah, 4 разных подхода, и никто из них не работает. Вздох

Поблагодарите ваши мысли или толчок в правильном направлении, пожалуйста.

4b9b3361

Ответ 1

Попробуйте

, SqlGuid sID = New Guid()

Вы можете использовать

if (sID == Guid.Empty)

Чтобы проверить, не присвоено ли ему значение.

Ответ 2

Есть ли что-то не так, просто передавая в Nulls значения, которые вы хотите по умолчанию?
Конечно, это может не работать в любой ситуации.
Иногда вам может потребоваться узнать, действительно ли фактическое значение Null, и, следовательно, не использовать значение по умолчанию.
Если это так, тогда я прибегну к добавлению дополнительного параметра "Default".

[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;
}

Это избавляет от необходимости записывать дополнительные "обертки" sprocs для получения необязательных параметров со значениями по умолчанию, которые затем вызывают CLR sproc.

Использовать значение по умолчанию при переходе нулевого значения: UseDefault_pID = 1
Чтобы сохранить фактическое значение при переходе нулевого значения: UseDefault_pID = 0

Ответ 3

Просто объявите его как:

[Microsoft.SqlServer.Server.SqlProcedure]
public static void spCalcPerc(
     SqlGuid pID
    , SqlGuid sID
    )

И затем зарегистрируйте его вручную в SQL Server:

ALTER PROCEDURE [dbo].[spCalcPerc]
    @pID [uniqueidentifier],
    @sID [uniqueidentifier] = null
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SqlServerProject3].[StoredProcedures].[spCalcPerc]

И затем вы можете использовать свойство IsNull, чтобы проверить, действительно ли sID null:

SqlContext.Pipe.Send(sID.IsNull.ToString());

Я не знаю, как мне объявить по умолчанию код С#.

Ответ 4

Я не пробовал, но вы попробовали

Guid.Empty

?

Ответ 5

Как вы указали, это связано с тем, что С# 2.0 не поддерживает необязательные параметры.

Обходным способом может быть обертка хранимых процедур .NET в обычных хранимых процедурах T-SQL, которые принимают параметры по умолчанию.

Например:

CREATE PROCEDURE TestProcWrapper
(
    @TestIntWrapperParam int = null
)
AS
EXEC TestProc @TestInt = @TestIntWrapperParam

Ответ 6

Проверьте значение null следующим образом.

[Microsoft.SqlServer.Server.SqlProcedure]
public static void spCalcPerc(SqlGuid pID)
{
    // check for null or set default
    Guid refId = pID.IsNull ? Guid.NewGuid() : pID.Value;