我在數據庫中有大約12個簡單的基準數據表。作爲一個例子,我有Role
和Status
。這些表格的ID是uniqueidentifier
。我試圖創建一個存儲過程,它將允許我傳遞表名,ID列的名稱和我想要的值。SQL Server存儲過程具有表名,ID字段,唯一標識符的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
的過程將罰款。但是當我執行程序時,我得到這個錯誤:
Msg 8114, Level 16, State 5, Procedure GET_TABLE_DATA_BY_ID, Line 0
Error converting data type nvarchar to 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
我得到的錯誤:
Error converting data type nvarchar to 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作爲sp_executesql – lad2025
@ lad2025你能告訴我你的意思嗎?我是一名SQL新手。 –
不應該'@tableid = UserId,'@tableid ='UserId','? – lad2025