在我工作的公司,有一系列存储过程将用户定义的表作为输入参数,如果正在使用的过程并不总是需要它。在SSMS中,如果在没有定义UDT的情况下编写一个Execute语句,我会得到一个错误行,其中有一个工具提示,告诉我程序需要提供表,但是如果我尝试在不提供表的情况下运行它就可以了。
这使我认为这些是可选参数,即使它们没有其他输入参数需要的明确默认值?如果是这样的话你怎么强迫他们不可选?
正如我公司的程序一样,非选择性是优选的,但我想知道为什么这是一个学习点以及如何解决它。
这个SQL演示了我的问题:
CREATE TYPE Dummy_Table AS TABLE (ID INT, Name VARCHAR(50));
GO
CREATE PROCEDURE Dummy_Procedure @Mode VARCHAR(50), @Dummy_Table Dummy_Table READONLY
AS
BEGIN
SELECT @Mode
SELECT * FROM @Dummy_Table
END
GO
EXEC Dummy_Procedure @Mode = 'Dummy_Mode'
答案 0 :(得分:1)
TVP是可选的,如果你期待记录并且没有得到记录,它们会产生一些奇怪的行为。您可以包含一些逻辑来检查表中是否有任何记录。
这篇文章也有帮助: https://msdn.microsoft.com/en-us/library/bb510489.aspx
CREATE TYPE Dummy_Table AS TABLE (ID INT, Name VARCHAR(50));
GO
ALTER PROCEDURE Dummy_Procedure @Mode VARCHAR(50), @Dummy_Table Dummy_Table READONLY
AS
BEGIN
SELECT @Mode
declare @test int
SELECT @test = COUNT(*) FROM @Dummy_Table
if @test = 0
select 'stop'
else
select 'continue'
END
GO