Sql 无效的对象名称';用户定义的表类型';

Sql 无效的对象名称';用户定义的表类型';,sql,sql-server,tsql,database-design,sql-server-2008-r2,Sql,Sql Server,Tsql,Database Design,Sql Server 2008 R2,我得到一个错误: Invalid object name 'UDTT_SuppliersList'. 用户定义的表类型为: CREATE TYPE [dbo].[UDTT_SuppliersList] AS TABLE( [SupplierID] [int] NOT NULL, [Region_Name] [varchar](255) NULL, PRIMARY KEY CLUSTERED ( [SupplierID] ASC )WITH (IGNORE_DU

我得到一个错误:

Invalid object name 'UDTT_SuppliersList'.
用户定义的表类型为:

CREATE TYPE [dbo].[UDTT_SuppliersList] AS TABLE(
    [SupplierID] [int] NOT NULL,
    [Region_Name] [varchar](255) NULL,
    PRIMARY KEY CLUSTERED 
(
    [SupplierID] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
GO
我将它(pass作为参数)用于StoredProcess,它工作正常。但今天我尝试将其作为参数传递给表值函数。表已成功创建,没有错误。但当我试图调用该函数时,它给了我如上所述的错误

declare @tbl_UDTT_SuppliersList UDTT_SuppliersList 
--declare, and assume populated with data

select* from dbo.GetSupplierInvoicesByDate(@tbl_UDTT_SuppliersList)
以下是功能代码:

ALTER FUNCTION [dbo].[GetSupplierInvoicesByDate]
(
    @tbl_UDTT_SuppliersList as dbo.UDTT_SuppliersList READONLY
)
RETURNS 
@tableList TABLE(
    SupplierID int,
    InvoiceAmount decimal(19, 3)
    )
AS
BEGIN
    INSERT INTO @tableList (
        SupplierID, 
        InvoiceAmount
    )

    SELECT 
    inv.SupplierID as SupplierID
    ,inv.Amount as InvoiceAmount
    FROM dbo.Invoices inv
    inner join UDTT_SuppliersList tSupp on tSupp.SupplierID = inv.SupplierID
    WHERE inv.IsPaidFully = 0

    RETURN
END

问题在于您的功能:

 SELECT 
     inv.SupplierID as SupplierID
    ,inv.Amount as InvoiceAmount
 FROM dbo.Invoices inv
 inner join UDTT_SuppliersList tSupp       -- use use type, not table variable
    on tSupp.SupplierID = inv.SupplierID
应该是:

SELECT 
     inv.SupplierID as SupplierID
     ,inv.Amount as InvoiceAmount
FROM dbo.Invoices inv
JOIN @tbl_UDTT_SuppliersList tSupp 
  ON tSupp.SupplierID = inv.SupplierID;
您可能想知道为什么SQL Server允许这样做,答案很简单:

创建存储过程时,过程中的语句 进行语法分析以确保语法准确性。如果出现语法错误 在过程定义中遇到错误,将返回错误,并且 未创建存储过程。如果语句在语法上是 正确,存储过程的文本存储在 sys.sql_模块目录视图

第一次执行存储过程时,查询 处理器从中读取存储过程的文本 sys.sql_模块目录视图并检查对象的名称 所使用的程序都存在此过程称为延迟 名称解析,因为存储的 创建存储过程时,过程不需要存在,但 仅当它被执行时。

考虑使用内联语法以获得更好的性能:

ALTER FUNCTION [dbo].[GetSupplierInvoicesByDate](
    @tbl_UDTT_SuppliersList as dbo.UDTT_SuppliersList READONLY)
RETURNS  TABLE
AS
RETURN (SELECT 
         inv.SupplierID AS SupplierID
         ,inv.Amount AS InvoiceAmount
        FROM dbo.Invoices inv
        JOIN @tbl_UDTT_SuppliersList tSupp 
          ON tSupp.SupplierID = inv.SupplierID
        WHERE inv.IsPaidFully = 0);

我还建议阅读

显示函数代码并尝试:
声明@tbl_UDTT_suppliers列表dbo.UDTT_suppliers列表
问题中添加的函数代码,但这是另一个函数
报告\u GetSupplierInvoicesByDate
或它与
GetSupplierInvoicesByDate
相同,对不起,这是我的错误。您确定您的类型是在您当前使用的数据库中定义的吗?谢谢,它可以工作。但这并不好。我认为SQL-SERVER是否应该将此作为错误捕获,但编译成功。无论如何。感谢您帮助我解决此问题。@MIdrees请参阅更新,SQL Server的行为与+1完全一致