我已经创建了一些我需要半定期插入的新表。由于规范化,我决定在基表之上构建一个视图,以使报告对我自己和欧盟更合乎逻辑。我有一个好主意,试图使用存储过程通过不同的视图将插入推送到基表。我可以成功地在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)
答案 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,列名不应该“@”对吗?
这个视图也基于单个表吗?