为什么无法将唯一标识符/GUID传递给存储过程?

15

我有这个存储过程

USE [TestDB]
GO
/****** Object:  StoredProcedure [dbo].[sp_test]    Script Date: 06/12/2010 11:47:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[sp_test]  
    @id uniqueidentifier
AS
BEGIN

    select * from TestTbl where ProductId= @id

END

我随后在使用MS SQL 2005的SP时点击了执行。它弹出一个框,我在其中输入了GUID并从我的测试数据库中复制粘贴了它。

然后我收到了以下错误消息:

Msg 102, Level 15, State 1, Line 5 Incorrect syntax near 'cac671b'.

那么为什么我不能提交GUID呢?即使这些GUID是直接从数据库复制并且必须是有效的,因为它们已经被允许进入数据库了。


完全同意@marc_s的前缀观点。不要这样做。在所有过程前面使用sp_或usp_或其他前缀绝对没有任何好处。就像将表命名为'tblMyTable'或其他名称一样,也没有任何好处。 - NotMe
3个回答

31

两个提示:

  • 首先,不要将存储过程命名为 sp_(something),因为 Microsoft明确地警告不这样做。

我们建议您不要使用以 sp_ 作为前缀来创建任何存储过程。 SQL Server使用sp_前缀指定系统存储过程 。您选择的名称可能会与某些未来的系统过程冲突。

  • 其次:我没有问题像这样调用您的存储过程:

EXEC proc_test 'B551F2C8-8380-491B-A51F-436E51CDD08F'

你是如何调用你的存储过程的?给我们看看!


8

这条信息

“Incorrect syntax near 'cac671b'.”

可能意味着它正在尝试解析GUID本身。尝试用单引号将其分隔。


0

我想你是在复制和粘贴一个字符串。你能像这样声明并使用它吗?

CREATE PROCEDURE [dbo].[sp_test] 
    @guidstr varchar(37)
AS

DECLARE @guid uniqueidentifier 
SET @guid = CONVERT(uniqueidentifier, @guidstr)
...

这个想法还不错。它与我在开始搜索如何处理GUID并偶然发现这篇文章之前考虑的方向相似。我认为这个解决方案只是将OP的问题转移到CONVERT函数调用上。 - froggythefrog
它对我有效,这是我的问题的解决方案。 - Roger Tello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接