2014-01-08 97 views
1

我已經創建了一些我需要插入到半定期的新表。由於規範化,我決定在基本表之上構建一個視圖,以使報告對我和歐盟更合理。我明白了,嘗試使用存儲過程通過不同的視圖將插入插入到基表中。我可以在SSMS中成功運行插入語句,但是當我嘗試將它創建到存儲過程時,它會運行,因爲它似乎認爲我的插入是一個函數。創建存儲過程插入視圖

以下是錯誤:

Msg 215, Level 16, State 1, Procedure jedi.p_ForcePush, Line 12 
Parameters supplied for object 'jedi.v_midichlorians' which is not a function. If the parameters are intended as a table hint, a WITH keyword is required. 

這裏是我的腳本:

CREATE PROCEDURE jedi.p_ForcePush 
    @Field varchar(25) = NULL, 
    @Value varchar(250) = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 
    insert jedi.v_midichlorians (@field) values (@value) 
END 
GO 

我已經傾注了我的請願書,谷歌,但還沒有找到一個好的解決辦法。我用我的語法嘗試了很多不同的組合,但沒有做任何事情。

任何幫助非常感謝! (PS-SQL 2012)

回答

0
CREATE PROCEDURE jedi.p_ForcePush 
    @Field varchar(25) = NULL, 
    @Value varchar(250) = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @sql NVARCHAR(MAX); 

SET @sql = N'INSERT INTO jedi.v_midichlorians (' + QUOTENAME(@field) 
      + N') values (@value)' 

    EXECUTE sp_executesql @sql 
         , N'@Value varchar(250)' 
         , @Value 
END 
GO 

當您通過@field PARAM作爲參數的SQL Server將其視爲一個字符串不是對象名稱,使用QUOTENAME()[]方括號包裹傳遞的列名告訴SQL Server的明確規定它是一個對象(表,列)名稱。

在旁註意如果您的視圖只有一個基礎表,然後使用視圖插入值其他智慧使用表名稱。

如果在View的定義中確實有多個基礎表,並且想要使用視圖插入數據,則需要創建Instead of triggers

最佳選擇是直接對錶進行插入,更新刪除操作,避免使用視圖,然後根據多於一個基礎表觸發視圖。

+0

工作完美!非常感謝...並且我學到了新東西 – JellyBellyJedi

0

雖然你提到插入stmts在ssMS中運行正常,你能否確認在SSMS中運行的是同樣的插入嗎?因爲ethere在這個stmt中是錯誤的。

「插入jedi.v_midichlorians(@field)」

了Syntex是inccoect和列名應dnot有 「@」 是嗎?

也是基於單個表的這個視圖嗎?

+0

該視圖基於多個表格。這些表格被標準化,並且視圖更容易看到所有相關的信息。它也應該簡化插入過程,因爲我的所有列名都在一個地方。 – JellyBellyJedi

+0

我試圖讓存儲過程爲字段和值提供輸入參數。變量是varchar我認爲會被正確解析,但也許我需要包括引號來表示字符串? – JellyBellyJedi

+0

正如Ali所提到的,在您的情況下,您的視圖基於多個表,並且如果Insert基於多個表,則無法通過視圖完成。視圖適合選擇複雜連接,並且可以將所有過濾器包裝在其中,並且您的選擇查詢仍然很簡單。無論如何,在你的情況下,你應該直接使用動態SQL的表名作爲阿里解釋。 –