我在数据库中有大约12个表是简单的基线数据。例如,我有Role
和Status
。这些表的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'.
答案 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