Вставка значения GUID (uniqueidentifier) ​​в хранимую процедуру - PullRequest
1 голос
/ 01 июня 2011

У меня есть эта хранимая процедура, которая хранит информацию в нескольких таблицах, и одной из ключевых переменных является то, что я могу передать процедуре значение guid для связывания этих таблиц.

Это выглядит как

USE [MyDatabase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[my_createCompany]
    @CompanyName nvarchar(255),
    @CompanyDescription nvarchar(255),
    @ParentGuid uniqueidentifier
AS
    BEGIN

        DECLARE @CompanyGuid uniqueidentifier
        SET @CompanyGuid = NEWID()

        SET NOCOUNT ON
    Insert into [dbo].[tblPROCompany]
    (
        [CompanyGuid],
        [CompanyName],
        [CompanyDescription],
        [ParentGuid]
    )
    VALUES
    (
        @CompanyGuid,
        @CompanyName,
        @CompanyDescription,
        @ParentGuid
    )
END

Выглядит правильно, но при назначении GUID переменной @ParentGuid процедура завершается ошибкой.Когда я смотрю на вывод, это что-то вроде этого

USE [MyDatabase]
GO    
DECLARE @return_value int    
EXEC    @return_value = [dbo].[my_createCompany]
        @CompanyName = N'Asd',
        @CompanyDescription = NULL,
        @ParentGuid = 4864DE55-60FB-4A69-814F-428B0178F4BB

SELECT  'Return Value' = @return_value

GO

И ошибка курса Msg 102, Уровень 15, Состояние 1, Строка 7 Неверный синтаксис рядом с 'DE55'.

Так этоне инкапсулирует @ParentGuid как следует.Сейчас я сделал обходной путь, объявляя @ParentGuid как varchar

@ParentGuid varchar(37), --uniqueidentifier

и преобразовывая его в то, что база данных хочет до вставки

if @ParentGuid is not null
BEGIN
    DECLARE @ParentGuidConverted uniqueidentifier
    SET @ParentGuidConverted = convert(uniqueidentifier, @ParentGuid)
END

Есть ли лучший способделать это?

Спасибо

Ответы [ 3 ]

4 голосов
/ 01 июня 2011

Вы пытались просто поместить одинарные кавычки вокруг направляющей.

2 голосов
/ 01 июня 2011

Это только (частично) нарушенное поведение при выполнении хранимой процедуры с помощью мастера SSMS. Фактически вызывая его из клиентского кода, большинство библиотек доступа к данным позволяют передавать параметры с использованием соответствующих типов (например, в виде Guid из кода .Net), а библиотека доступа к данным гарантирует, что они будут переданы соответствующим образом.

Если записать его непосредственно в окно запроса, заключите значение в одинарные кавычки.

0 голосов
/ 16 ноября 2012
USE [MyDatabase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[my_createCompany]
    @CompanyName nvarchar(255),
    @CompanyDescription nvarchar(255),

AS
    BEGIN



        SET NOCOUNT ON
    Insert into [dbo].[tblPROCompany]
    (
        [CompanyGuid],
        [CompanyName],
        [CompanyDescription],
        [ParentGuid]
    )
    VALUES
    (
        NEWID(),
        @CompanyName,
        @CompanyDescription,
        NEWID()
    )
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...