无需言 做自己 业 ,精于勤 荒于嬉.
- SQLServer 大坑之分页
-
发表日期:2022-08-20 10:46:18 | 来源: | 分类:SQLServer
-
示例1
SELECT T1.* FROM (SELECT result.*, ROW_NUMBER() OVER ( ORDER BY rand()) AS ROW_NUMBER FROM (SELECT * FROM [Users] WHERE ustate = 1) AS result ) AS T1 WHERE (T1.ROW_NUMBER BETWEEN 1 AND 10)
示例2
SELECT top 10 * FROM [Users] WHERE ustate = 1 and uid not in( SELECT top ( N * 10) UID FROM [Users] WHERE ustate = 1 --N:0第一页 1第二页 类推 )
示例3
select top 10 * from Users where uid > ( select isnull(max(uid),0) from ( select top N uid from Users order by uid --N:0第一页 1第二页 类推 ) A ) order by uid
- SQLServer Link DB Server
-
发表日期:2022-08-20 09:56:53 | 来源: | 分类:SQLServer
-
示例1
--查看当前链接情况: select * from sys.servers; --使用 sp_helpserver 来显示可用的服务器 Exec sp_helpserver --显示使用sp_addlinkedserver来增加服务器链接 EXEC sp_addlinkedserver @server='LINKABC',--被访问的服务器别名 @srvproduct='', @provider='SQLOLEDB', @datasrc='192.168.0.10\sql2008' --要访问的服务器IP[\实例名有就写没有] --然后使用sp_addlinkedsrvlogin 来增加用户登录链接 EXEC sp_addlinkedsrvlogin 'LINKABC', --被访问的服务器别名 'false', NULL, 'root', --帐号 '123456' --密码 访问: select * from [LINKABC].[abcDB].dbo.Users where uid = 1; 也支持IP形式: select * from [192.168.0.10].[abcDB].dbo.Users where uid = 1; -- 删除数据库链接 --与创建相反,要先删除登录账户 exec sp_droplinkedsrvlogin 'LINKABC',null --然后再删除数据库链接 exec sp_dropserver 'LINKABC'
- SQLServer 存储过程详解
-
发表日期:2022-08-19 15:57:32 | 来源: | 分类:SQLServer
-
示例1
-- 如果没有参数 可以不写参数 CREATE PROCEDURE [存储名] @参数1 int, @参数2 varchar(50), @参数3 varchar(2000),@参数4 varchar(100) as -- 存储的主体 go
示例2
exec [存储过程名字] @参数1=1,@参数2='aaa', @参数3sql='bbbb',@参数4where ='ccccc'; 或者简写,即按字段顺序 exec [存储过程名字] 1,'aaa', 'bbbb','ccccc'; exec 也可以写成全称 execute
示例3
-- 参数可以传入SQL语句直接在存储过程里执行,通常不建议这样干! exec (@参数); -- 传入的参数也可以是半截sql,然后再拼起来执行,通常不建议这样干! -- 而且通常这么干都是在代码里把接收到的参数拼起来传,十有八九有SQL注入漏洞 exec ('delete from TestTab2 where a=b and d=c and '+@参数4where);示例4
-- 定义临时表 DECLARE @table_tmp table ( a int, b VARCHAR(50), c int, d int, e VARCHAR(50), f VARCHAR(50), g DECIMAL DEFAULT 0 ); -- 写法用法和普通表没什么区别,考验你的SQL基础能力罢了 insert into @table_tmp (a, b, c, d) select uid,username,age,10 from Users where type=3; update @table_tmp set e=(select role_name from user_profile where uid = a) where age > 18; UPDATE t set t.f = r.role_name FROM @table_resoult as t, user_role as r where r.uid = t.a; update @table_tmp set g=(select sum(money) from user_account where uid = a) where g = 0; update c set c.d=b.score from @table_tmp c join ( select * from xxxxx ) b on c.a = b.uid and c.e = b.role; --最后达到你想要的结果集了,你可以把虚拟表的数据插入到目标真实表 insert into targetTab(a1,b1,c1,d1,e1,f1,g1) select a,b,c,d,e,f,g from @table_tmp; -- 或者存储过程直接返回临时表的结果 select * from @table_tmp;
示例5
--可以定义变量 declare @var1 varchar(50) --给定义的变量赋值 select @username = username from users where UID = 1; --使用变量 update user_house set update_time=getdate(), username=@username where uid = 1;
示例6
--开启事务 begin tran -- 这里进行业务操作 -- …… --如果有错 if (0 <> @@ERROR) begin --事务回滚 rollback tran; -- 返回错误码 select -1; end else begin --提交事务 commit tran; -- 可以返回修改行数或 其它内容 select @@ROWCOUNT; end
示例7
--定义变量 declare @uid int,@username varchar(50); -- 定义游标 填充数据 declare c1 cursor for select UID,UName from Users where uuid <> 0; --开启游标 open c1 aa:fetch next from c1 into @uid,@username -- 循环 while @@fetch_Status = 0 begin -- 业务逻辑 end -- 关闭游标 close c1 -- 销毁游标 deallocate c1
- SQLServer 大坑之事务回滚占自增ID
-
发表日期:2022-08-18 11:33:59 | 来源: | 分类:SQLServer
-
主键如果是自增的,当你使用事务时,即便是事务回滚了,你的下一个ID会被占用,再次插入会跳一个数。
这个大坑在一些业务场景下极其讨厌,比如这张表的ID是某编号你希望是连续的那就很膈应了。

你可以看到上面的例子,执行多次后ID全是间隔的,就是因为回滚事务的那条也占用了ID自增。
注意:mysql也是如此
- SQLServer 存储报错:SQLSTATE[IMSSP]: The active result for the query contains no fields.
-
发表日期:2022-08-16 17:00:00 | 来源: | 分类:SQLServer
-
存储报错:SQLSTATE[IMSSP]: The active result for the query contains no fields.
原因:
一般执行execute语句,也就是增删改语句会返回修改记录数的行数。执行select 是返回记录。
存储里可能是先执行了增删改,最后是select 返回结果,就会报这个错。
在存储里增加这句话,让存储不返回影响的记录数就可以了。
SET NOCOUNT ON
- SQLServer 大坑之导入数据
-
发表日期:2022-08-16 16:49:34 | 来源: | 分类:SQLServer
-
Cannot insert explicit value for identity column in table 'test' when IDENTITY_INSERT is set to OFF
这句报错的大致意思就是这张表有自增列,不能直接导入。
SQLServer 导入表,如果这张表的ID是自增那就非常烦,导入会报错。提示你必须先允许插入自增,插入完成再关闭。
set IDENTITY_INSERT 表名 on
insert into ……
insert into ……
set IDENTITY_INSERT 表名 off
当然要是一张表还好办,我要导入N张表,可是把我烦死了,而且单表SQL文件特别大,打开都费劲。
- SQLServer 大坑之浮点数显示问题
-
发表日期:2022-08-15 16:47:01 | 来源: | 分类:SQLServer
-
以下情况在php+SQLserver下经过验证是存在问题的,其它语言请自酌。
一、字段类型是float类型时

输出
显示正常,十分具有迷惑性,开发的时候你以为是没问题的,
但是

输出
150.12 显示为 15.119999999999999
这是太坑了,我们的项目是重构一个用了15年+的项目,库不变只做程序,项目里见到最多的字段就是金额小数点,做到后面发现这个问题,所有输出的位置到处都得格式化去改!
还有一个问题是,如果你希望的是x.xx这种保留两位的格式,不好意思,不建议用float类型!因为12.00 进库即存为12,出库也12,不格式化没法是12.00!
对比之下mysql是没有问题的,因为是是这样定义的float(9,2)保留两位!
二、字段类型是 decimal(18, 2) 类型时
0.00 显示为 .00

输出:

导致于 所有显示地方都得把 .00 换成 0.00。
(后发现可能是php-SQLserver驱动的兼容问题一个项目用的pdo_dblib显示是好的,一个用的pdo_sqlsrv显示不正常,可能跟驱动版本有关系,反正用php+SQLserver的小伙伴格外注意一下),
- SQLServer 大坑之数字乘除计算
-
发表日期:2022-08-15 12:16:52 | 来源: | 分类:SQLServer
-
10 / 4 * 4 = ? , 小学毕业都知道应该还是10,
我们用mysql试一下:

依然是10,其实当计算出小数,mysql会自动转型为float,但是注意,SQLserver不会!

得出的结果是8! 为什么是8呢,有点离谱。
因为SQLserver是强类型的,10/4 = 2 ,2*4=8,因此如果你的字段是int类型的你想在SQL里做乘除那你可得想好了,记得先把计算的字段转型为float

- SQLServer 大坑之null 判断
-
发表日期:2022-08-15 12:00:34 | 来源: | 分类:SQLServer
-
例如

三条数据,我们找出 misMoney是null的

然而一条也没出来!
mysql 的null 你写 where a = null / where a <> null 都没毛病,当然我一直也认为其实能这样判断是最好最方便,但是SQLserver不支持!
尤其现在绝大多数程序员及项目都用的是mysql,所以很多程序员没用过甚至不了解SQLserver。我面试过很多程序员,答对的很少,全然不知SQL语句 null 的正确判断写法。
正确写法

一定要有 is null 或 is not null !
参考另一篇文章:
- SQLServer 大坑之不等于判断
-
发表日期:2022-08-15 11:50:20 | 来源: | 分类:SQLServer
-
例如有三条数据:

我们想找出 posMoney和misMoney不一致的数据,逻辑很简单 我们通常想到且写的是:
where posMoney <> misMoney ,理论上出的结果是王五和李四。
然后我们看结果

只有一条王五!! 20000和null 的竟然出不来!
这就是SQLserver的大坑,一定要注意,mysql是没有问题的,但是SQLserver是不能和可能存在null列进行对比,
当然我事先是知道这个的,但是!!有时候我们认为的数据实际不应该有null,但现实是前几天发现业务系统里这列数据居然因为某些异常情况存在很多null值,以至于我这样写成为了被错误。这是最坑的,这才是更是应该注意的,所以代码最好把所有可能性想到,避免让别人的错误成为自己的错。
所以,在SQLserver里如果是金额等严谨性判断<> 最好这样写:

不管你认为可不可能有null 总之先把null替换为数字0或空字符串'',然后再对比 <>,多么痛的领悟……
- MYSQL 创建用户及数据库,并赋予权限
-
发表日期:2022-08-12 17:01:56 | 来源: | 分类:MYSQL
-
示例1
#创建一个名为 testUser 的用户,%指任意主机可以连接 或 127.0.0.1 指定ip连接 #需要特别注意的是:'testUser'@'%'与'testUser'@'localhost' 看起来像是一个用户,事实上要注意 这是两个用户!可以有不同的权限 CREATE USER 'testUser'@'%' IDENTIFIED WITH mysql_native_password; #给这个用户赋予一些查询mysql环境的权限 GRANT USAGE ON *.* TO 'testUser'@'%' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0; #给这个用户设置密码 SET PASSWORD FOR 'testUser'@'%' = '123456'; #创建数据库 testDB CREATE DATABASE IF NOT EXISTS `testDB`; #把 testDB库的所有权限 赋予 'testUser'@'%'的登录用户 GRANT ALL PRIVILEGES ON `testDB`.* TO 'testUser'@'%'; # `testDB\_%`.* TO 'testDB'@'%'; 这里可以使用通配符% 代表 把testDB_开头的数据库都给这个用户
- idea小技巧 语法错误之间跳转
-
发表日期:2022-01-11 21:53:30 | 来源: | 分类:idea小技巧
-
按 F2/Shift+F2 在突出显示的语法错误之间跳转。
按 Ctrl+t+向上箭头/Ctrl+Alt+向上箭头Al 在错误消息或搜索结果之间跳转。
要跳过警告,请右键单击验证侧栏/标记栏并选择仅转到高优先级问题。
- idea小技巧 快速查看类或方法的文档
-
发表日期:2022-01-11 21:52:53 | 来源: | 分类:idea小技巧
-
要快速查看插入符号处的类或方法的文档,请按 Ctrl+Q(查看 | 快速文档)。

- idea小技巧 使用最近的搜索历史
-
发表日期:2022-01-11 21:51:42 | 来源: | 分类:idea小技巧
-
在文件中搜索文本字符串时,使用最近的搜索历史。按 Ctrl+F 打开搜索窗格,然后按 Alt+向下箭头显示最近条目列表。

- idea小技巧 Ctrl+Alt+Shift+D
-
发表日期:2022-01-11 21:47:55 | 来源: | 分类:idea小技巧
-
如果您的项目处于版本控制之下,您可以构建一个 UML 图来反映您的本地更改并可视化修改后的组件之间的关系。
按 Ctrl+Alt+Shift+D 并选择必要的更改列表来构建图表。双击图表上的节点以查看差异对话框中的更改。

- idea小技巧 Shift 两次
-
发表日期:2022-01-11 21:47:07 | 来源: | 分类:idea小技巧
-
在 Search Everywhere(Shift 两次)窗口的搜索字段中输入“/”以搜索设置列表、它们的选项和插件。
您还可以搜索在您正在搜索的 URL 映射部分之前输入“/”的 URL 映射。

- idea小技巧 在列模式下选择多个片段
-
发表日期:2022-01-11 21:45:42 | 来源: | 分类:idea小技巧
-
要在列模式下选择多个片段 Alt+Shift+Insert,请按住 Ctrl+Alt+Shift(在 Windows 和 Linux 上)/⌘⌥⇧(在 macOS 上),然后拖动鼠标:

- idea小技巧 SQL 文件运行查询
-
发表日期:2022-01-11 21:38:17 | 来源: | 分类:idea小技巧
-
双击 SQL 文件以在 IDE 中打开它。要从此文件运行查询,请调用意图操作(对于 macOS,Option + Enter,对于 Windows 和 Linux,Alt+Enter)并选择在控制台中运行查询。在 Sessions 列表中,选择现有控制台或创建一个新控制台。
请注意,新的查询控制台意味着与数据源的新连接。

- idea小技巧 Alt+Enter
-
发表日期:2022-01-11 21:36:43 | 来源: | 分类:idea小技巧
-
在编辑器中按 Alt+Enter 可修复突出显示的错误或警告、改进或优化代码结构。
对于某些意图操作,您可以通过按 Ctrl+Shift+I(查看 | 快速定义)打开预览。

- idea小技巧 基本代码补全
-
发表日期:2022-01-11 21:35:38 | 来源: | 分类:idea小技巧
-
基本代码补全 Ctrl+空格在当前文件中搜索文本时在搜索字段中可用 Ctrl+F,因此无需键入整个字符串。

宁公网安备 64010402001209号