SQL Server存储过程,其参数为表名,ID字段,ID字段值为uniqueidentifier

时间:2015-08-28 13:07:47

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

我在数据库中有大约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'.

1 个答案:

答案 0 :(得分:0)

使用显式参数:

<强> 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