关于 Guid 的 一些 赋值 及 为空 判断

Guid 

 

Guid类型的变量不会为空,初始化没有赋值的GUID应该是00000000-0000-0000-0000-000000000000 。

1  SQL 

SELECT NEWID() 'NEWID()'  --正常赋值

----- 以下 为 GUID --1、SQL Server专用写法是使用CONVERT函数:在SQL Server的字段中设定默认值的时候也只能这么写 SELECT CONVERT([UNIQUEIDENTIFIER], CONVERT([BINARY], (0), (0)), (0)) AS CONVERT_GUID --2、ANSI标准的功能写法是使用CAST函数: SELECT CAST(CAST(0 AS BINARY) AS UNIQUEIDENTIFIER) AS CAST_GUID --CAST函数相对CONVERT而言功能较弱,但是通用性强,更容易被其他数据库系统所使用。 DECLARE @emptyGUID UNIQUEIDENTIFIER; SELECT @emptyGUID = '00000000-0000-0000-0000-000000000000'; SELECT @emptyGUID AS G1; SELECT @emptyGUID = CAST(CAST(0 AS BINARY) AS UNIQUEIDENTIFIER); SELECT @emptyGUID AS G2;

运行结果:

 

 

 

2 C#

正确的判断应该是if(Guid testId== Guid.Empty)

如:

       Guid guid = Guid.Parse("00000000-0000-0000-0000-000000000000"); 
            //Guid guid = Guid.Parse("E441C253-5080-4619-803A-00849D8CF710");
            Console.WriteLine(guid);
            if (guid == Guid.Empty)
            {
                Console.WriteLine("GUID无效");
            }
            else
            {
                Console.WriteLine("GUID有效");
            }

            Console.Read();
//打印结果
GUID无效

但是Guid?  guid = null  是可以的为空的, 判断方式:

     Guid? guid = null;
    if (guid.ToString() == "" || !guid.HasValue)
            {
                Console.WriteLine("GUID无效");
            }
 

 

3 为 GUID 添加默认值 (转自:https://blog.csdn.net/cai15191466621/article/details/7237188?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

ALTER TABLE [dbo].[TableName] 
    ADD CONSTRAINT [DF_TableName_GUID]
    DEFAULT (newsequentialid()) 
    FOR [GUID]
ALTER TABLE [dbo].[TableName] 
    ADD CONSTRAINT [DF_TableName_GUID]
    DEFAULT (newid()) 
    FOR [GUID]


 当使用群集的主键列的数据类型,NEWSEQUENTIALID()函数应该被用作列的默认值,使聚类不会导致磁盘颠簸和页面在DML操作分割。如果不是集群的主键,使用NEWID()和NEWSEQUENTIALID()都是合适的。

 

4  sql 转化  ( 转自:https://www.cnblogs.com/dzy863/p/5056546.html )

还是工作中遇到的需求,有时候和外部的系统对接,进行数据的核对功能,外部的系统有时候主键字段列数据类是UNIQUEIDENTIFER(GUID)类型的字符串格式,去除了GUID格式中的分隔符“-”。基于上面的原因,在数据库中可能要将这类的“GUID去格式化的字符串”转化为GUID,便于和本系统的相关联数据进行来核对。
 
SQL Server中的字符串转化为GUID的T-SQL代码如下:
IF OBJECT_ID(N'dbo.ufn_GUID', 'FN') IS NOT NULL
BEGIN
    DROP FUNCTION dbo.ufn_GUID;
END;
GO

--==================================
-- 功能: 字符串转换为GUID
-- 说明: 1、不足32为的字符串则转换为0x0
-- 调用: SET @uniGuid = dbo.fn_GUID('31F74CD6EDE94B19BC4C29A8A7791DC7')
--==================================
CREATE FUNCTION dbo.ufn_GUID
(
    @chnStr NCHAR(32) -- 字符串
)
RETURNS UNIQUEIDENTIFIER
--$Encode$--
AS
BEGIN
    -- 初始化处理NULL时的变量@chnStr的默认值
    SET @chnStr = ISNULL(@chnStr, N'');

    IF LEN(@chnStr) < 32
    BEGIN
        RETURN 0x0;
    END;

    RETURN LEFT(@chnStr, 8) + '-' + SUBSTRING(@chnStr, 9, 4) + '-' + SUBSTRING(@chnStr, 13, 4) + '-'
           + SUBSTRING(@chnStr, 17, 4) + '-' + SUBSTRING(@chnStr, 21, 12);
END;
GO
View Code
演示该标量函数效果的T-SQL代码如下:
1 SELECT dbo.ufn_GUID('31F74CD6EDE94B19BC4C29A8A7791DC7') AS GuidVule;

 

5 LINQ select 处理  UNIQUEIDENTIFIER (guid)

 var drs = from row in dt.AsEnumerable()
                              where com_uniqueids.Contains(row.Field<Guid>("实例标识").ToString())
                              select row;

com_uniqueids 是一个guid的字符串数组;

6   SqlFunctions.StringConvert()。( 详情 见  https://www.cnblogs.com/missile/p/11122909.html)

  SqlFunctions.ConvertGuidToChar
IF EXISTS
(
    SELECT *
    FROM dbo.sysobjects
    WHERE id = OBJECT_ID(N'[dbo].[ConvertGuidToChar]')
          AND xtype IN ( N'FN', N'IF', N'TF' )
)
    DROP FUNCTION [dbo].ConvertGuidToChar;
GO
CREATE FUNCTION ConvertGuidToChar
(
    @id UNIQUEIDENTIFIER
)
RETURNS VARCHAR(50)
AS
BEGIN
    RETURN CONVERT(VARCHAR(50), @id);
END;
from a in d.WorkflowInstance
join b in d.xxx//xxx.ID为guid类型
on new { a.ForeignTable, a.ForeignKey } equals new { ForeignTable = nameof(xxx), ForeignKey =  SqlFunctionsExtension.ConvertGuidToChar(b.ID) }
select a;

 

posted @ 2020-06-23 10:36  余路还要走多久  阅读(1556)  评论(0编辑  收藏  举报