【问题标题】:Why can't I pass in a uniqueidentifier/GUID to a stored procedure为什么我不能将唯一标识符/GUID 传递给存储过程
【发布时间】:2010-06-12 18:50:44
【问题描述】:

我有这个SP

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 中输入的框。我直接从我的测试数据库中复制并粘贴了它。

我收到此错误。

消息 102,级别 15,状态 1,第 5 行 'cac671b' 附近的语法不正确。

那么为什么我不能发送 GUID?即使是直接从数据库中复制的,也必须是有效的,因为它们允许进入数据库。

【问题讨论】:

  • 100% 同意 @marc_s 的前缀。只是不要。在所有 procs 前面使用 sp_ 或 usp_ 或任何东西绝对没有任何好处。就像将表格命名为“tblMyTable”之类的没有任何好处。

标签: sql sql-server-2005 stored-procedures


【解决方案1】:

两个提示:

  • 首先,不要不要调用您的存储过程sp_(something) - Microsoft 特别是warns against that

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

  • 其次:我可以毫不费力地像这样调用您的存储过程:

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

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

【讨论】:

    【解决方案2】:

    消息

    “cac671b”附近的语法不正确。

    必须表示它正在尝试解析 GUID 本身。尝试用单引号分隔它。

    【讨论】:

      【解决方案3】:

      我想你正在复制和粘贴一个字符串。可以这样声明和使用吗?

      CREATE PROCEDURE [dbo].[sp_test] 
          @guidstr varchar(37)
      AS
      
      DECLARE @guid uniqueidentifier 
      SET @guid = CONVERT(uniqueidentifier, @guidstr)
      ...
      

      【讨论】:

      • 这主意不错。在我开始搜索如何处理 guid 并遇到这篇文章之前,这与我正在考虑的内容一致。我认为这个解决方案只会将 OP 的问题转移到 CONVERT 函数调用。
      • 它对我有用,这是解决我问题的方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      相关资源
      最近更新 更多