2015-08-28 22 views
-1

我在數據庫中有大約12個簡單的基準數據表。作爲一個例子,我有RoleStatus。這些表格的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'. 
+0

是有可能,但不要連接字符串,請使用@param_list作爲sp_executesql – lad2025

+0

@ lad2025你能告訴我你的意思嗎?我是一名SQL新手。 –

+0

不應該'@tableid = UserId,'@tableid ='UserId','? – lad2025

回答

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 
+0

這是存儲過程嗎? –

+0

是的,但我不明白你的SPROC''哪裏'+ cast(@tableid as nvarchar)+'= @ value''你的列是否有GUID名? – lad2025

+0

是的,ID字段是唯一標識符,我使用C#中的GUID過程獲得。 –

相關問題