1

我是 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'))
4

3 回答 3

6

首先关闭什么关系数据库管理系统?

但是,我怀疑这type是表中的列或存储过程中的变量。

N, 表示您正在将下一个字符串转换为nchar,nvarcharnvarchar2(取决于 RDBMS)。这些是允许多字节字符的数据类型。

'PC'并且'P'是字符串。

将所有这些放在一起,您将转换'PC''P' 多字节字符集,并检查列或变量type是否与这些字符串之一相同。

in表示type可以与相同'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是表。该文档为您提供了完整列表。

于 2012-05-27T12:46:11.877 回答
6

如果您希望您的问题对其他人有用,则评论中的详细信息属于问题的主体,因为这些标识符仅在sysobjects表格的上下文中才有意义。

以下是含义。

  • U - 用户表
  • P - 传统存储过程 (SQL)
  • PC - CLR 存储过程(通常是 C# 或 VB.NET)

因此,您的子句检查是否sp_authetication存在任何调用的过程。

于 2012-05-27T13:01:26.787 回答
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

...
于 2012-05-27T12:56:01.537 回答