我有这个存储过程,它将信息存储在几个表中,其中一个关键变量是我可以使用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
看起来是正确的,但是当为变量@ParentGuid分配GUID时,过程失败。当我看输出时,它就像这样
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,Level 15,State 1,Line 7 'DE55'附近的语法不正确。
所以它没有应该封装@ParentGuid。现在我已经做了一个解决方法,将@ParentGuid声明为varchar
@ParentGuid varchar(37), --uniqueidentifier
并在插入之前将其转换为数据库所需的内容
if @ParentGuid is not null
BEGIN
DECLARE @ParentGuidConverted uniqueidentifier
SET @ParentGuidConverted = convert(uniqueidentifier, @ParentGuid)
END
有更好的方法吗?
由于
答案 0 :(得分:4)
您是否尝试过将单引号放在guid周围。
答案 1 :(得分:2)
使用SSMS向导执行存储过程时,这只是(部分)损坏的行为。当从客户端代码实际调用它时,大多数数据访问库允许您使用适当的类型传递参数(例如,作为.Net代码的Guid),数据访问库将确保它被适当地传递。
如果直接将其写入查询窗口,请用单引号括起该值。
答案 2 :(得分:0)
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