创建存储过程以插入视图

时间:2014-01-08 22:50:35

标签: sql sql-server stored-procedures view

我已经创建了一些我需要半定期插入的新表。由于规范化,我决定在基表之上构建一个视图,以使报告对我自己和欧盟更合乎逻辑。我有一个好主意,试图使用存储过程通过不同的视图将插入推送到基表。我可以成功地在SSMS中运行insert语句,但是当我尝试将其创建到存储过程时,它将运行,因为它似乎认为我的插入是一个函数。

这是错误:

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)

2 个答案:

答案 0 :(得分: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只有一个基础表,则使用视图插入其他值的值使用表名。

如果View的定义中有多个基础表,并且您希望使用视图插入数据,则需要创建Instead of triggers

最好的选择是直接对表进行插入,更新删除操作,避免使用视图,然后根据多个基础表触发视图。

答案 1 :(得分:0)

虽然您提到插入stmts在ssMS中运行正常,但您能确认在SSMS中运行的插入stmt是否相同?因为这是一个错误。

“insert jedi.v_midichlorians(@field)”

syntex是inccoect,列名不应该“@”对吗?

这个视图也基于单个表吗?