存储过程中用户定义表的强制性质是什么

时间:2015-02-06 10:47:46

标签: sql-server tsql

在我工作的公司,有一系列存储过程将用户定义的表作为输入参数,如果正在使用的过程并不总是需要它。在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'

1 个答案:

答案 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