我是SQL的初学者。我找不到这行:
type in (N'P', N'PC')
where子句中有什么:P,PC,U?
编辑:
完整查询是:
IF EXISTS (SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].SP_AUTHENTIFICATION]')
AND type in (N'P', N'PC'))
答案 0 :(得分:6)
如果您希望您的问题对其他人有用,则评论中的详细信息属于问题正文,因为这些标识符仅在sysobjects
表的上下文中有意义。
这是意思。
因此,您的子句会检查是否存在任何名为sp_authetication
的过程。
答案 1 :(得分:5)
首先关闭什么是关系数据库管理系统?
但是,我怀疑type
是表中的列或存储过程中的变量。
N
,表示您要将下一个字符串转换为nchar
,nvarchar
或nvarchar2
(取决于RDBMS)。这些是允许多字节字符的数据类型。
'PC'
和'P'
是字符串。
将所有内容放在一起,您将'PC'
和'P'
转换为多字节字符集,并检查列或变量type
是否与其中一个字符串相同。
in
表示type
可以与 <{em> 'PC'
或 'P'
相同。
根据您的评论,您正在使用SQL-Server
您正在检查对象[dbo].[SP_AUTHENTIFICATION]
是否存在,并且是存储过程(P)还是程序集存储过程(PC)。
type
中的sys.objects
列不是nchar
,因此转化毫无意义。
逐点前进
IF EXISTS
- 如果括号中的以下查询的结果返回一行:SELECT * FROM sys.objects
- 从sys.objects
WHERE object_id =
- object_id
等于以下内容OBJECT_ID(N'[dbo].[SP_AUTHENTIFICATION]')
- 返回object_id
[dbo].[SP_AUTHENTIFICATION]
AND type in (N'P', N'PC')
- 该对象是存储过程的位置。 U
正在检查type
是否为表格。 The documentation为您提供完整列表。
答案 2 :(得分:0)
'line'正在寻找名为SP_AUTHENTIFICATION的存储过程,如果存在则可能会丢弃它。这在SQL Server中很常见,因为SQL Server没有CreateOrAlter。
我找到了一种更好的方法来执行CreateOrAlter,以便在存储过程中维护历史记录。
if not exists(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[myproc]') AND type in (N'P', N'PC'))
exec('create proc dbo.myproc as select 0')
alter proc dbo.myproc
as
...