【问题标题】:SQL Server stored procedure with parameters for table name, ID field, ID field value that is uniqueidentifierSQL Server 存储过程,其参数为表名、ID 字段、ID 字段值,即唯一标识符
【发布时间】:2015-08-28 13:07:46
【问题描述】:

我在数据库中有大约 12 个表是简单的基线数据。例如,我有RoleStatus。这些表的 ID 为uniqueidentifier。我正在尝试创建一个存储过程,它允许我传递表名、ID 列的名称和我想要的值。

我试过这个:

ALTER PROCEDURE [dbo].[GET_TABLE_DATA_BY_ID]
    @table      nvarchar(50),
    @tableid    uniqueidentifier,
    @value      uniqueidentifier
AS
BEGIN
    SET NOCOUNT ON;

    DECKALE @cmd AS nvarchar(max)
    SET @cmd = N'select * ' +
                'from ' + @table +
                'where ' + cast(@tableid as nvarchar) + '= @value'

    EXEC sp_executesql @cmd
END

程序添加罚款。但是当我执行该过程时,我得到了这个错误:

消息 8114,级别 16,状态 5,过程 GET_TABLE_DATA_BY_ID,第 0 行
将数据类型 nvarchar 转换为 uniqueidentifier 时出错。

这甚至可能吗?否则我将不得不编写许多不同的程序,更不用说许多不同的 C# 函数了。

当我右键单击该过程并输入要测试的值时,它会创建以下内容:

   DECLARE  @return_value int

   EXEC @return_value = [dbo].[GET_TABLE_DATA_BY_ID]
                        @table = N'UserProfile',
                        @tableid = UserId,
                        @value = 'FB743B78-5B90-4A52-8177-6D516884700B'

   SELECT   'Return Value' = @return_value
   GO

我得到错误:

将数据类型 nvarchar 转换为 uniqueidentifier 时出错。

我根据建议重做了程序:

 DECLARE @cmd  NVARCHAR(MAX) = 
          N'SELECT * 
            FROM @table
            WHERE tableid = @value',
    @param_list NVARCHAR(MAX) =
          N'@table  NVARCHAR(50),
            @tableid UNIQUEIDENTIFIER';

EXEC [dbo].[sp_executesql]
      @cmd
     ,@param_list
     ,@table
     ,@tableid;

当我在新的查询窗口中执行此操作时,我得到了正确的数据:

 select * from UserProfile where UserId = 'FB743B78-5B90-4A52-8177-6D516884700B'

但是当我使用这些值执行 proc 时它不起作用 -

  Msg 105, Level 15, State 1, Line 4
  Unclosed quotation mark after the character string '@value'.
  Msg 102, Level 15, State 1, Line 4
  Incorrect syntax near '@value'.

【问题讨论】:

  • 是的,有可能,但不要连接字符串,使用@param_list for sp_executesql
  • @lad2025 你能给我一个例子来说明你的意思吗?我是 SQL 新手。
  • 不应该是@tableid = UserId,@tableid = 'UserId',
  • 确认或拒绝:你想select * FROM UserProfile WHERE UserId = 'long-guid-xyz'
  • 是的,这就是我想要做的。

标签: sql-server-2008 stored-procedures uniqueidentifier


【解决方案1】:

使用显式参数:

SqlFiddleDemo

DECLARE
  @tablename NVARCHAR(100)    = 'tab1',
  @tableid   NVARCHAR(100)    = 'a',
  @value     UNIQUEIDENTIFIER = '2FD22D07-E128-4133-ABA9-9B75215CB465'

DECLARE
  @cmd NVARCHAR(MAX) = 
          N'SELECT * 
            FROM '  + QUOTENAME(@tablename) +
           'WHERE ' + QUOTENAME(@tableid)  + ' = @value'

EXEC [dbo].[sp_executesql]
  @cmd
 , N'@value UNIQUEIDENTIFIER'
 , @value

【讨论】:

  • 这会在存储过程中吗?
  • 是的,但我不明白你的 SPROC 'where ' + cast(@tableid as nvarchar) + '= @value' 中的一件事你的列有 GUID 名称吗?
  • 是的,ID 字段是唯一标识符,这是我在 C# 中使用 GUID 进程获得的。
  • 对不起,我不确定我是否理解正确,请编辑问题并添加表格+示例数据。
  • 我尝试通过右键单击它来执行程序,然后我会看到要输入的值。我输入表格、表格 ID 字段和我知道表格中的值。我收到此错误:'-' 附近的语法不正确,这告诉我应该将唯一字段设置在引号中,但是当我这样做时,我收到错误将数据类型 nvarchar 转换为唯一标识符。
猜你喜欢
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
相关资源
最近更新 更多