【发布时间】:2015-08-28 13:07:46
【问题描述】:
我在数据库中有大约 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'.
【问题讨论】:
-
是的,有可能,但不要连接字符串,使用@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