关于 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无效"); }
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
演示该标量函数效果的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;