Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL脚本中创建类型表?_Sql_Sql Server - Fatal编程技术网

如何在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我认为它现在可以工作了。。。