个人博客 用于记载日常收集的一些技术文章 ...
SQL : SQL 统计中文个数 SQL : SQL 统计中文个数
DECLARE @Txt varchar(1000) SET @Txt = '销售发票(专用)1:,'

SELECT DATALENGTH(@Txt) 个数_全角2半角1
,LEN(@Txt) 个数_不区分半角
,DATALENGTH(@Txt) - LEN(@Txt) 中文个数
,LEN(@Txt)*2 - DATALENGTH(@Txt) 非中文个数
/*
个数_全角2半角1 个数_不区分半角 中文个数 非中文个数
17 11 6 5
*/
郭少锋 创建 2023-02-12 23:03:06 SQL
SQL : SQL 查询条件 区分【全角】【半角】 SQL : SQL 查询条件 区分【全角】【半角】 -- 查询时,区分【全角】【半角】+ collate Chinese_PRC_CI_AS_WS,不加就是默认相同

select 1 where '03BHL01001(上海)'='03BHL01001(上海)'
collate Chinese_PRC_CI_AS_WS
郭少锋 编辑 2023-02-12 22:42:50 创建 2023-02-12 22:42:39 SQL
PHP : SQL 条件判断 IF ELSE PHP : SQL 条件判断 IF ELSE -- 条件判断:【不为空 提示错误】【否则 删除数据】

DECLARE @Caption VARCHAR(255)
DECLARE @Err VARCHAR(255)

SELECT @Caption = 'ds'

IF NOT @Caption IS NULL
BEGIN
SELECT @Err = @Caption + ' 已经被 凭证模板作为金额来源,不能删除或将字段类型改为非金额类型!'
RAISERROR(@Err, 18, 18)

RETURN --【中止】【后面的语句 SELECT TOP 3 * FROM ICVoucherTField 】
END

ELSE
BEGIN
Delete FROM ICVoucherTField WHERE FBillType=2010 AND FUserDefineField='F_SalePrice'
END

SELECT TOP 3 * FROM ICVoucherTField

/* 结果:

消息 50000,级别 18,状态 18,第 12 行
ds 已经被 凭证模板作为金额来源,不能删除或将字段类型改为非金额类型!
*/
郭少锋 编辑 2023-02-09 22:54:09 创建 2023-02-09 22:51:26 PHP
PHP : SQL 最大值 + 1 PHP : SQL 最大值 + 1 SELECT ISNULL( MAX(FInterID),0 ) + 1 FROM ICVoucherTField -- 如果没有记录,= 0 + 1 郭少锋 编辑 2023-02-09 22:37:05 创建 2023-02-09 22:36:45 PHP PHP : SQL 判断是否 存在记录 PHP : SQL 判断是否 存在记录 -- 如果 记录不存在,则 添加记录

IF Not Exists(Select * From t_FieldDescription Where FFieldName ='F_SaleAmount')
Begin
INSERT INTO t_FieldDescription( FTableID,FFieldName ) Select FTableID,'F_SaleAmount' From t_TableDescription Where FTableName ='ICStockBillEntry'
End
郭少锋 创建 2023-02-09 22:34:13 PHP
SQL : SQL 判断更新结果 SQL : SQL 判断更新结果 -- 更新时,不存在记录,添加记录

UPDate ICVoucherTField Set FFieldName ='产品出库单业务金额' Where FBillType = 21 And FUserDefineField='F_SaleAmount'
IF @@RowCount =0
Begin
INSERT INTO ICVoucherTField( FInterID ) VALUES ( 21 )
End
郭少锋 创建 2023-02-09 22:28:47 SQL
windows : Win10 版本区别 windows : Win10 版本区别 Win10系统 business 和 consumer 区别详解:

  一、两者的产品名称区别
  1、Win10 business edition为批量版(也称VOL版),指市面上的win10商业版集合。
  2、Win10 consumer edition则为零售版,指的是市面上的win10普通版本集合。

  二、两者的内置Win10版本区别
  1、consumer editions版本包含Home(家庭版)、Education(教育版)、Professional(专业版)。
  2、business editions版本包含Education(教育版)、Enterprise (企业版)、Professional(专业版)。

  三、扩展说明
  business edition和consumer edition均是win10的版本集合产品,而win10分有七个版本,具体如下:
  1、家庭版(Home):供家庭用户使用,无法加入Active Directory和Azure AD,不允许远程链接。
  2、专业版(Professional):供小型企业使用 在家庭版基础上增加了域账号加入、bitlocker、企业商店等功能。
  3、企业版(Enterprise):供中大型企业使用 在专业版基础上增加了DirectAccess,AppLocker等高级企业功能。
  4、教育版(Education):供学校使用 (学校职员, 管理人员, 老师和学生) 其功能基本和企业版的一样。
  5、移动版(Mobile):面向尺寸较小、配置触控屏的移动设备,例如智能手机和平板电脑,集成有与Windows 10家庭版相同的通用Windows应用和针对触控操作优化的Office。
  6、移动企业版(Mobile Enterprise):以移动版为基础的企业版本。该版本可以批量允许客户使用,添置企业管理更新功能,以及安全补丁软件的检查与更新功能。
  7、专业工作站版(Windows 10Pro for Workstations):该版本重点优化了多核处理以及大文件处理的功能,提供6TB大内存、ReFS文件系统、高速文件共享和工作站模式。
  8、物联网核心版(Windows 10 IoT Core):面向小型低价设备,主要针对物联网设备。


Windows 10 (China Get Genuine) 简称为「Win10中国定制版」,发布日期为:2022 年 10 月 18 日,主流支持结束时间为 2025 年 10 月 14 日。
里面只有家庭中文版,是一个相对比较小众的版本,用的人比较少,里面可能预装了360/腾讯的一些软件,又或者面向PC厂商以及政府用户群体推出的定制版。
总之,它属于微软和中国的合作伙伴推出的中国特供版本,是一个装了不能更改语言的家庭版,一般不建议普通用户使用。
郭少锋 创建 2023-02-06 18:09:09 windows
SQL : SQL 事务 SQL : SQL 事务
----------------------------------------------------------------------------------------
-- 创建表

USE master
CREATE TABLE student
(
stuid INT NOT NULL PRIMARY KEY,
stuname VARCHAR(50)
)
CREATE TABLE score
(
stuid INT NOT NULL REFERENCES student(stuid),
score INT
)

------------------------------------------------------------------------------------------------------------------------
-- 因为事务里有插入分数为190(>100)的记录, 所以整个事务回滚。

begin tran

INSERT INTO student VALUES (101,'zhangsan')
INSERT INTO student VALUES (102,'wangwu')

INSERT INTO score VALUES (101,190)
INSERT INTO score VALUES (102,78)

if exists(select 1 from score where score>100)
rollback
else
commit tran

------------------------------------------------------------------------------------------------------------------------

INSERT INTO student VALUES (101,'zhangsan')
INSERT INTO student VALUES (102,'wangwu')
INSERT INTO student VALUES (103,'lishi')
INSERT INTO student VALUES (104,'maliu')


select * from student
select * from score

-- delete from score


------------------------------------------------------------------------------------------------------------------------
-- 执行如下sql,出现了运行时错误(外键冲突), 整个事务无法回滚

SET XACT_ABORT OFF
BEGIN TRAN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107,76) -- student.stuid 不存在 107
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)
COMMIT TRAN

select * from student
select * from score

-- delete from score


/*
(1 行受影响)
(1 行受影响)

消息 547,级别 16,状态 0,第 6 行
INSERT 语句与 FOREIGN KEY 约束"FK__score__stuid__58671BC9"冲突。该冲突发生于数据库"master",表"dbo.student", column 'stuid'。
语句已终止。

(1 行受影响)
(1 行受影响)

stuid score
101 90
102 78
103 81
104 65
*/


------------------------------------------------------------------------------------------------------------------------
-- SET XACT_ABORT ON 在事务中,若出现错误,系统即默认回滚事务,但只对非自定义错误有效

SET XACT_ABORT ON
BEGIN TRAN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107,76)
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)

COMMIT TRAN
SET XACT_ABORT OFF

select * from student
select * from score

-- delete from score


/*
(1 行受影响)
(1 行受影响)

消息 547,级别 16,状态 0,第 6 行
INSERT 语句与 FOREIGN KEY 约束"FK__score__stuid__58671BC9"冲突。该冲突发生于数据库"master",表"dbo.student", column 'stuid'。

stuid score
没有数据
*/


------------------------------------------------------------------------------------------------------------------------
-- 使用TRY...CATCH构造,并调用一个运行时错误

SET XACT_ABORT OFF
BEGIN TRY
BEGIN TRAN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107,76)
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)

COMMIT TRAN
PRINT '事务提交'
END TRY
BEGIN CATCH
ROLLBACK
PRINT '事务回滚'

SELECT ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() as ErrorState,
ERROR_MESSAGE() as ErrorMessage;
END CATCH

select * from student
select * from score

-- delete from score

/*

(1 行受影响)
(1 行受影响)

事务回滚

(1 行受影响)

ErrorNumber ErrorSeverity ErrorState ErrorMessage
547 16 0 INSERT 语句与 FOREIGN KEY 约束"FK__score__stuid__58671BC9"冲突。该冲突发生于数据库"master",表"dbo.student", column 'stuid'。

stuid score
没有数据
*/




------------------------------------------------------------------------------------------------------------------------
-- 使用TRY...CATCH构造,并调用一个运行时错误

SET XACT_ABORT OFF
BEGIN TRY
BEGIN TRAN
Alter Table student Add stuname VARCHAR(50)

COMMIT TRAN
PRINT '事务提交'
END TRY
BEGIN CATCH
ROLLBACK
PRINT '事务回滚'

SELECT ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() as ErrorState,
ERROR_MESSAGE() as ErrorMessage;
END CATCH

/*
消息 2705,级别 16,状态 4,第 5 行
各表中的列名必须唯一。在表 'student' 中多次指定了列名 'stuname'。
*/
郭少锋 创建 2023-02-05 14:18:02 SQL
SQL : SQL:触发器 SQL : SQL:触发器 INSERT触发器: 向表中插入数据时被触发
UPDATE触发器:修改表中数据时被触发
DELETE触发器:从表中删除数据时被触发

INSERT 触发器:
在向目标表中插入数据后,会触发该表的INSER触发器,系统自动在内存中创建INSERTED表

UPDATE 触发器:
在向目标表中更新数据后,会触发该表的UPDATE触发器,系统自动在内存中创建DELETED表和INSERTED表,DELETED表存放的是更新前的数据,INSERTED表存放的是更新的数据

Delete 触发器:
在向目标表中删除数据后,会触发该表的Delete 触发器,系统自动在内存中创建DELETED表,DELETED表存放的是删除的数据

DEMO:

Create TRIGGER [dbo].[Trigger]
ON [dbo].BD_Supplier
AFTER INSERT --UPDATE --DELETE
AS
BEGIN
SET NOCOUNT ON
SELECT * FROM INSERTED
SELECT * FROM DELETED
END

--------------------------------------------------------------------
CREATE TRIGGER OrdDet_Insert
ON [Order Details]
FOR INSERT
AS
UPDATE P SET UnitsInStock = P.UnitsInStock – I.Quantity
FROM Products AS P
INNER JOIN Inserted AS I ON P.ProductID = I.ProductID

--------------------------------------------------------------------
CREATE TRIGGER Category_Delete
ON Categories
FOR DELETE
AS
UPDATE P SET Discontinued = 1
FROM Products AS P
INNER JOIN deleted AS d ON P.CategoryID = d.CategoryID

--------------------------------------------------------------------
CREATE TRIGGER dbo.SEOrderEntry_Update
ON dbo.SEOrderEntry
FOR UPDATE
AS
IF UPDATE (FCommitQty) -- 更新的字段
BEGIN
SELECT * FROM inserted
SELECT * FROM deleted
END
GO
郭少锋 编辑 2023-01-28 23:34:47 创建 2023-01-28 23:23:33 SQL
SQL : SQL:UPDATE 带参数运算 SQL : SQL:UPDATE 带参数运算
declare @fcheck_fail int
declare @fsrccommitfield_prevalue decimal(28,13)
declare @fsrccommitfield_endvalue decimal(28,13)
declare @maxorder int

update src
set @fsrccommitfield_prevalue = isnull(src.fcommitqty,0),
@fsrccommitfield_endvalue = @fsrccommitfield_prevalue + dest.fqty,
@maxorder = (select fvalue from t_systemprofile where fcategory='ic' and fkey='cqtylargerseqty'),
@fcheck_fail = case isnull(@maxorder,0) when 1 then 0 else (case when (abs(src.fqty)>abs(@fsrccommitfield_prevalue) or abs(src.fqty)>abs(@fsrccommitfield_endvalue)) then @fcheck_fail else -1 end) end,

src.fcommitqty=@fsrccommitfield_endvalue,
src.fauxcommitqty=@fsrccommitfield_endvalue/cast(t1.fcoefficient as float)

from seorderentry src
inner join seorder srchead on src.finterid=srchead.finterid
inner join (
select u1.fsourceinterid as fsourceinterid,u1.fsourceentryid,u1.fitemid,sum(u1.fqty) as fqty
from icstockbillentry u1
where u1.finterid=1783
group by u1.fsourceinterid,u1.fsourceentryid,u1.fitemid

) dest on dest.fsourceinterid = src.finterid and dest.fitemid = src.fitemid and src.fentryid = dest.fsourceentryid

inner join t_measureunit t1 on src.funitid=t1.fitemid


if (isnull(@fcheck_fail,0)=-1)
raiserror('可能的原因是:
1、所选单据已被其他单据关联
2、所选单据已被反审核
3、当前单据和所选单据的关联数量超过了所选单据的数量
4、所选单据已经关闭',18,18)
else
if exists (
select 1 from seorder src right join (select u1.fsourceinterid as fsourceinterid,u1.fsourceentryid,u1.fitemid,sum(u1.fqty) as fqty
from icstockbillentry u1
where u1.finterid=1783
group by u1.fsourceinterid,u1.fsourceentryid,u1.fitemid) dest on dest.fsourceinterid = src.finterid where dest.fsourceinterid>0 and src.finterid is null
)
raiserror('所选单据已被删除',18,18)
郭少锋 创建 2023-01-28 22:52:53 SQL