不存在从cstring到lpcwstr的适当转换函数_sql server 2012之,object_id函数

在使用SQL Server 2012时,遇到从cstring到lpcwstr转换的挑战,因为没有直接的适配函数。本文探讨了这个问题,并详细介绍了如何在不支持这种转换的情况下,通过其他方法操作字符串。同时,还深入解析了object_id函数的用法,帮助理解其在数据库查询中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*object_id函数的使用,返回架构范围内对象的数据库对象标识号。
OBJECT_ID (Transact-SQL) SQL ServerSQL Server 
返回架构范围内对象的数据库对象标识号。
重要说明重要提示 
使用 OBJECT_ID 不能查询非架构范围内的对象(如 DDL 触发器)。
对于在 sys.objects 目录视图中找不到的对象,需要通过查询适当的目录视图来获取该对象的标识号。 
例如,若要返回 DDL 触发器的对象标识号,请使用 SELECT OBJECT_ID FROM sys.triggers WHERE name = 'DatabaseTriggerLog'。 
 主题链接图标
Transact-SQL 语法约定
语法
--------------------------------------------------------------------------------
OBJECT_ID ( '[ database_name . [ schema_name ] . | schema_name . ] 
  object_name' [ ,'object_type' ] )
OBJECT_ID ( '[ database_name . [ schema_name ] . | schema_name . ] 
  object_name' [ ,'object_type' ] )

参数
--------------------------------------------------------------------------------

'object_name'

要使用的对象。
object_name 的数据类型为 varchar 或 nvarchar。 
如果 object_name 的数据类型为 varchar,则它将隐式转换为 nvarchar。 
可以选择是否指定数据库和架构名称。

'object_type'

架构范围的对象类型。
object_type 的数据类型为 varchar 或 nvarchar。 
如果 object_type 的数据类型为 varchar,则它将隐式转换为 nvarchar。 
有关对象类型的列表,请参阅 sys.objects (Transact-SQL) 中的 type 列。 

返回类型
--------------------------------------------------------------------------------
int
异常
--------------------------------------------------------------------------------
对于空间索引,OBJECT_ID 返回 NULL。
出现错误时,返回 NULL。
用户只能查看其拥有的安全对象的元数据,或者已对其授予权限的安全对象的元数据。
也就是说,如果用户对该对象没有任何权限,则那些会生成元数据的内置函数(如 OBJECT_ID)可能返回 NULL。
有关详细信息,请参阅 元数据可见性配置。 
注释
--------------------------------------------------------------------------------
当该参数对系统函数可选时,则采用当前数据库、主机、服务器用户或数据库用户。
内置函数后面必须跟括号。
当指定临时表名时,除非当前数据库为 tempdb,否则必须在该临时表名之前加上数据库名称。 
例如: SELECT OBJECT_ID('tempdb..#mytemptable')。 
系统函数可以在选择列表、WHERE 子句和任何允许使用表达式的地方使用。
有关详细信息,请参阅 表达式(Transact-SQL)和 WHERE (Transact-SQL)。 
示例
--------------------------------------------------------------------------------
A.返回指定对象的对象 ID
以下示例返回 AdventureWorks 数据库中 Production.WorkOrder 表的对象 ID。 
Transact-SQL以带有颜色区分的格式查看复制到剪贴板打印USE master;
  GO
  SELECT OBJECT_ID(N'AdventureWorks2012.Production.WorkOrder') AS 'Object ID';
  GO
 USE master;
GO
SELECT OBJECT_ID(N'AdventureWorks2012.Production.WorkOrder') AS 'Object ID';
GO



B.验证对象是否存在

以下示例通过验证表是否具有对象 ID 来检查指定表的存在性。
如果该表存在,则将其删除。
如果该表不存在,则不执行 DROP TABLE 语句。 

Transact-SQL以带有颜色区分的格式查看复制到剪贴板打印USE AdventureWorks2012;
  GO
  IF OBJECT_ID (N'dbo.AWBuildVersion', N'U') IS NOT NULL
  DROP TABLE dbo.AWBuildVersion;
  GO
  
  
USE AdventureWorks2012;
GO
IF OBJECT_ID (N'dbo.AWBuildVersion', N'U') IS NOT NULL
DROP TABLE dbo.AWBuildVersion;
GO



C.使用 OBJECT_ID 指定系统函数的参数值

以下示例使用 sys.dm_db_index_operational_stats 函数返回 AdventureWorks 数据库中 Person.Address 表的所有索引和分区信息。 

重要说明重要提示 

在使用 Transact-SQL 函数 DB_ID 和 OBJECT_ID 返回参数值时,请始终确保返回有效的 ID。
如果找不到数据库或对象的名称,例如相应名称不存在或拼写不正确,则两个函数都会返回 NULL。
sys.dm_db_index_operational_stats 函数将 NULL 解释为指定所有数据库或所有对象的通配符值。 
由于这可能是无心之举,所以此部分中的示例说明了确定数据库 ID 和对象 ID 的安全方法。
 

Transact-SQL以带有颜色区分的格式查看复制到剪贴板打印DECLARE @db_id int;
  DECLARE @object_id int;
  SET @db_id = DB_ID(N'AdventureWorks2012');
  SET @object_id = OBJECT_ID(N'AdventureWorks2012.Person.Address');
  IF @db_id IS NULL 
    BEGIN;
      PRINT N'Invalid database';
    END;
  ELSE IF @object_id IS NULL
    BEGIN;
      PRINT N'Invalid object';
    END;
  ELSE
    BEGIN;
      SELECT * FROM sys.dm_db_index_operational_stats(@db_id, @object_id, NULL, NULL);
    END;
  GO

*/
IF OBJECT_ID(N'dbo.v_audit_支出科目经济分类全称') IS NOT NULL --返回值非空则该对象存在,可以删除
DROP VIEW dbo.v_audit_支出科目经济分类全称
go
CREATE VIEW dbo.v_audit_支出科目经济分类全称
AS
WITH cte_a
AS (
   SELECT ITEMID,
          CODE,
          NAME,
          PCODE,
          LEVELNO
   FROM [FASP2019].[dbo].[T_PUBEXPECO]),
     cte_b
AS (SELECT a.ITEMID,
           a.CODE,
           a.NAME,
           CAST(a.NAME AS NVARCHAR(MAX)) AS full_name,
           a.PCODE,
           a.LEVELNO
    FROM cte_a AS a
    WHERE a.LEVELNO = 1
    UNION ALL
    SELECT s.ITEMID,
           s.CODE,
           s.NAME,
           CAST(p.full_name + '/' + s.NAME AS NVARCHAR(MAX)) AS full_name,
           s.PCODE,
           s.LEVELNO
    FROM cte_a AS s
        INNER JOIN cte_b AS p
            ON s.PCODE = p.CODE)
SELECT TOP 1000
       *
FROM cte_b AS a
ORDER BY CODE;

2388a21db0fbf2b50cdb776d2409c1fb.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值