【发布时间】:2015-02-17 09:15:39
【问题描述】:
我的 orm 工具执行程序的方式有问题。
这就是我的执行方式:
exec PostViewProc @Id='18767F6A-FF7A-47E9-AF09-6DB8A2F3B20E',@AuthorId='5455D9B9-B25A-41BD-BD2C-C9CBAE87D629'
按预期返回 1 行..
这就是 orm 工具生成它的方式:
exec sp_executesql
N'EXEC [PostViewProc] @Id, @AuthorId',
N'@Id uniqueidentifier,@AuthorId uniqueidentifier',
@Id='18767F6A-FF7A-47E9-AF09-6DB8A2F3B20E',@AuthorId='5455D9B9-B25A-41BD-BD2C-C9CBAE87D629'
不返回任何内容!
第一个工作正常。但是 orm 生成的“sp_executesql”永远无法正常工作。如果我删除@AuthorId,orm 生成的可以正常工作,但是我添加了一些其他参数,它又会崩溃。
我还有其他一些程序,并且一遍又一遍地遇到同样的问题。不同的参数会导致意想不到的结果,即使是参数的数量也会导致意想不到的结果。甚至错误。 (当使用 sp_executesql 时,其他的工作都很好)
我需要对这里发生的事情进行一些很好的解释,因为程序本身没有任何问题,我现在很困惑。
【问题讨论】:
-
实际程序中定义的参数顺序是怎样的?我能看到的唯一区别是,在您的查询中,您明确声明了参数,而动态 sql 只传递值(
EXEC proc @Param = @ParamValuevsEXEC proc @ParamValue) -
@GarethD Id 1,AuthorId 8。我是否必须定义所有参数并为它们设置一些值,即使我不需要它们(因为它是这样工作的)。该过程处理空参数,实际上所有参数的默认值都是空的。我可以像“Exec PostViewProc”一样执行它而无需任何参数..
-
不确定它是什么 ORM,但我会说解决方法是以正确的顺序传递所有参数,并在适当的地方传递 null。请记住,该过程不知道要传递的参数的名称 - 因此,尽管您传递了一个名为
@AuthorID的变量,但该过程只看到它的值,因此无法猜测您想将其作为值传递给同名参数。 -
看来我需要传递所有参数,我同意,但必须问一下;我在使用 sp_executesql 时确实传递了参数名称和类型,不是吗?为什么proc无法匹配它们?这 4 行 tsql 代码是做什么的?我不明白。我还应该对该 proc 定义什么以使其了解这里发生的情况? :)
-
花了我更多的时间来回答所有这些问题,所以不得不添加一个答案,但希望它有所帮助。
标签: sql-server tsql stored-procedures exec sp-executesql