Сохраненная процедура Параметр Тип проверки


1 принят

Я не говорю, что это хорошо, но если вы действительно хотите проверить, вы можете сделать это в сохраненной процедуре. Ниже приведен краткий пример, который может дать вам несколько вещей, которые вы могли бы реализовать, если хотите. В C # преобразовать int в строку и передать его как в качестве параметра, затем он преобразуется обратно, чтобы убедиться, что они совпадают. В приведенном ниже примере я добавил BIT, как и вы, поэтому ошибка возникает.

CREATE PROCEDURE dbo.pTypeTest

    @int BIT            ,
    @str NVARCHAR(10)
AS
BEGIN

    SET NOCOUNT ON;

    DECLARE @bitTheSame     BIT             ,
            @intBaseType    NVARCHAR(20)    ,   
            @strBaseType    NVARCHAR(20);

    SELECT @intBaseType = CAST(SQL_VARIANT_PROPERTY(@int,'BaseType') AS NVARCHAR(20));
    SELECT @strBaseType = CAST(SQL_VARIANT_PROPERTY(@str,'BaseType') AS NVARCHAR(20));

    SELECT @bitTheSame = CASE WHEN CAST(@int AS NVARCHAR(10)) <> @str THEN 0 ELSE 1 END;

    IF(@bitTheSame = 0)
        BEGIN
            DECLARE @message NVARCHAR(200);
            SELECT @message = 'Something went wrong, @str: ' + @str + ' does not match @int: '+CAST(@int AS NVARCHAR(10))+' when it has been converted. @str is a '+@strBaseType+' and @int is a '+@intBaseType;
            RAISERROR(@message,16,1);
        END
    IF(@bitTheSame = 1)
        BEGIN
            PRINT 'Ok';
        END

END

Пример:

EXEC dbo.pTypeTest @int = 1000,@str = '1000';

Повышенная ошибка:

Msg 50000, уровень 16, состояние 1, процедура pTypeTest, строка 24 Что-то пошло не так, @str: 1000 не соответствует @int: 1, когда он был преобразован. @str - это nvarchar, а @int - немного


0

Совершенно законно вызывать процедуру с параметрами, которые имеют неявные преобразования типов параметров.

Но вы можете (и должны) уйти от руки, записывая вызовы хранимой процедуры. Вместо этого создайте код на основе метаданных SQL Server, используя, например, шаблон T4.

EG запрос для предоставления вам процедур и типов параметров будет выглядеть так:

select object_name(m.object_id) ObjectName, 
       SCHEMA_NAME(o.schema_id) SchemaName,
       o.type_desc ObjectTypeDesc,
       p.name ParameterName,
       t.name TypeName,
       p.precision,
       p.scale,
       p.max_length,
       p.default_value,
       p.is_output     
from 
sys.sql_modules m
join sys.objects o
  on o.object_id = m.object_id
join sys.parameters p
  on m.object_id = p.object_id
join sys.types t
  on p.system_type_id = t.system_type_id
order by o.object_id, p.parameter_id
SQL-сервер, vb.net, хранимая-процедура,

sql-server,vb.net,stored-procedures,

0

Ответов: 2


1 принят

Я не говорю, что это хорошо, но если вы действительно хотите проверить, вы можете сделать это в сохраненной процедуре. Ниже приведен краткий пример, который может дать вам несколько вещей, которые вы могли бы реализовать, если хотите. В C # преобразовать int в строку и передать его как в качестве параметра, затем он преобразуется обратно, чтобы убедиться, что они совпадают. В приведенном ниже примере я добавил BIT, как и вы, поэтому ошибка возникает.

CREATE PROCEDURE dbo.pTypeTest

    @int BIT            ,
    @str NVARCHAR(10)
AS
BEGIN

    SET NOCOUNT ON;

    DECLARE @bitTheSame     BIT             ,
            @intBaseType    NVARCHAR(20)    ,   
            @strBaseType    NVARCHAR(20);

    SELECT @intBaseType = CAST(SQL_VARIANT_PROPERTY(@int,'BaseType') AS NVARCHAR(20));
    SELECT @strBaseType = CAST(SQL_VARIANT_PROPERTY(@str,'BaseType') AS NVARCHAR(20));

    SELECT @bitTheSame = CASE WHEN CAST(@int AS NVARCHAR(10)) <> @str THEN 0 ELSE 1 END;

    IF(@bitTheSame = 0)
        BEGIN
            DECLARE @message NVARCHAR(200);
            SELECT @message = 'Something went wrong, @str: ' + @str + ' does not match @int: '+CAST(@int AS NVARCHAR(10))+' when it has been converted. @str is a '+@strBaseType+' and @int is a '+@intBaseType;
            RAISERROR(@message,16,1);
        END
    IF(@bitTheSame = 1)
        BEGIN
            PRINT 'Ok';
        END

END

Пример:

EXEC dbo.pTypeTest @int = 1000,@str = '1000';

Повышенная ошибка:

Msg 50000, уровень 16, состояние 1, процедура pTypeTest, строка 24 Что-то пошло не так, @str: 1000 не соответствует @int: 1, когда он был преобразован. @str - это nvarchar, а @int - немного


0

Совершенно законно вызывать процедуру с параметрами, которые имеют неявные преобразования типов параметров.

Но вы можете (и должны) уйти от руки, записывая вызовы хранимой процедуры. Вместо этого создайте код на основе метаданных SQL Server, используя, например, шаблон T4.

EG запрос для предоставления вам процедур и типов параметров будет выглядеть так:

select object_name(m.object_id) ObjectName, 
       SCHEMA_NAME(o.schema_id) SchemaName,
       o.type_desc ObjectTypeDesc,
       p.name ParameterName,
       t.name TypeName,
       p.precision,
       p.scale,
       p.max_length,
       p.default_value,
       p.is_output     
from 
sys.sql_modules m
join sys.objects o
  on o.object_id = m.object_id
join sys.parameters p
  on m.object_id = p.object_id
join sys.types t
  on p.system_type_id = t.system_type_id
order by o.object_id, p.parameter_id
SQL-сервер, vb.net, хранимая-процедура,
Похожие вопросы