如何在SQL脚本中创建类型表?
我试图创建一个表类型,并将其作为参数传递给过程。但是,一旦我运行脚本,一旦我开始出现错误,要么声称该类型不存在,要么因为过程需要它而无法删除它。以下是我到目前为止得到的信息: --创建类型:如何在SQL脚本中创建类型表?,sql,sql-server,Sql,Sql Server,我试图创建一个表类型,并将其作为参数传递给过程。但是,一旦我运行脚本,一旦我开始出现错误,要么声称该类型不存在,要么因为过程需要它而无法删除它。以下是我到目前为止得到的信息: --创建类型: IF TYPE_ID('usr.NameList') IS NOT NULL DROP TYPE usr.NameList; -- Cannot drop type 'usr.NameList' because it is being referenced by object 'JWBestMatch'.
IF TYPE_ID('usr.NameList') IS NOT NULL DROP TYPE usr.NameList; -- Cannot drop type 'usr.NameList' because it is being referenced by object 'JWBestMatch'. There may be other objects that reference this type.
CREATE TYPE usr.NameList AS TABLE ([name] VARCHAR(MAX) NOT NULL);
-- delete the procedure if it already exists:
IF OBJECT_ID('TEMPDB..#JWBestMatch') IS NOT NULL DROP PROCEDURE #JWBestMatch;
-- create the procedure
GO
CREATE PROCEDURE #JWBestMatch -- Cannot find data type usr.NameList
@name NVARCHAR(MAX),
@referenceTable usr.NameList READONLY,
@bestMatch NVARCHAR(MAX) OUTPUT
AS
BEGIN
RETURN;
END;
GO
那么如何创建一个类型呢?在我读过的文档中,它们只是告诉你如何创建它,而不是如何真正创建一个在运行一次后不会失败的脚本。我在这里遗漏了什么?我想这就是你想要做的:
IF OBJECT_ID('JWBestMatch') IS NOT NULL DROP PROCEDURE JWBestMatch;
GO
IF TYPE_ID('usr.NameList') IS NOT NULL DROP TYPE usr.NameList;
GO
CREATE TYPE usr.NameList AS TABLE ([name] VARCHAR(MAX) NOT NULL);
GO
CREATE PROCEDURE JWBestMatch
@name NVARCHAR(MAX),
@referenceTable usr.NameList READONLY,
@bestMatch NVARCHAR(MAX) OUTPUT
AS
BEGIN
RETURN;
END;
GO
不为proc使用temp DB和不每次删除类型似乎都有效:
IF TYPE_ID('usr.NameList') IS NULL CREATE TYPE usr.NameList AS TABLE ([name] VARCHAR(MAX) NOT NULL);
-- delete the procedure if it already exists:
IF OBJECT_ID('usr.JWBestMatch') IS NOT NULL DROP PROCEDURE usr.JWBestMatch;
-- create the procedure
GO
CREATE PROCEDURE usr.JWBestMatch
@name NVARCHAR(MAX),
@referenceTable usr.NameList READONLY,
@bestMatch NVARCHAR(MAX) OUTPUT
AS
BEGIN
RETURN;
END;
GO
存储过程在temdb中,类型在当前数据库中。我认为这是行不通的。在与您的类型相同的数据库中创建存储过程。@zespri好的,当我尝试重新创建该类型时,我仍然会得到“无法删除类型”usr.NameList…。。。nvm我认为它现在可以工作了。。。