2014-01-08 72 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的表名作为阿里解释。 –