首页
统计
留言
友链
壁纸
Search
1
Notion网页端汉化、主题修改
707 阅读
2
SnapicPlus主题添加视频功能以及使用外链详解、图片加载缓慢问题解决
550 阅读
3
Gravatar镜像源地址大全
535 阅读
4
typecho主题中文搜索404问题解决
507 阅读
5
Notion客户端中文安装
438 阅读
Web前端
ES6
Vue.js
Node.js
JavaScript
其他前端扩展
后端探索
数据库
服务器
小程序
手机端
奇技淫巧
成功之母
时光随笔
登录
Search
标签搜索
SQL
typecho
SqlServer
MySql
jQuery
JavaScript
npm
Gravatar
镜像
google
Java
包管理工具
前端
JS
node
数据库
Notion
BEGIN...END
EXECUTE
404
天祈
满目山河空念远 不如怜取眼前人
累计撰写
66
篇文章
累计收到
14
条评论
首页
栏目
Web前端
ES6
Vue.js
Node.js
JavaScript
其他前端扩展
后端探索
数据库
服务器
小程序
手机端
奇技淫巧
成功之母
时光随笔
页面
统计
留言
友链
壁纸
搜索到
66
篇与
的结果
2022-12-02
IIS添加看板娘时.moc文件不能访问
{alert type="info"}在网站中添加MIME类型即可拓展名为.moc MIME类型为application/octet-stream{/alert}
2022年12月02日
148 阅读
0 评论
0 点赞
2022-11-14
16. SQLServer : 函数
表值函数内联表值函数{alert type="info"}IF OBJECT_ID (N'Sales.ufn_SalesByStore', N'IF') IS NOT NULL DROP FUNCTION Sales.ufn_SalesByStore; GO CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int) RETURNS TABLE AS RETURN ( SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total' FROM Production.Product AS P JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID WHERE C.StoreID = @storeid GROUP BY P.ProductID, P.Name );{/alert}多语句表值函数{alert type="info"}IF OBJECT_ID (N'dbo.ufn_FindReports', N'TF') IS NOT NULL DROP FUNCTION dbo.ufn_FindReports; GO CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INTEGER) RETURNS @retFindReports TABLE ( EmployeeID int primary key NOT NULL, FirstName nvarchar(255) NOT NULL, LastName nvarchar(255) NOT NULL, JobTitle nvarchar(50) NOT NULL, RecursionLevel int NOT NULL ) --Returns a result set that lists all the employees who report to the --specific employee directly or indirectly.*/ AS BEGIN WITH EMP_cte(EmployeeID, OrganizationNode, FirstName, LastName, JobTitle, RecursionLevel) -- CTE name and columns AS ( SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, 0 -- Get the initial list of Employees for Manager n FROM HumanResources.Employee e INNER JOIN Person.Person p ON p.BusinessEntityID = e.BusinessEntityID WHERE e.BusinessEntityID = @InEmpID UNION ALL SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, RecursionLevel + 1 -- Join recursive member to anchor FROM HumanResources.Employee e INNER JOIN EMP_cte ON e.OrganizationNode.GetAncestor(1) = EMP_cte.OrganizationNode INNER JOIN Person.Person p ON p.BusinessEntityID = e.BusinessEntityID ) -- copy the required columns to the result of the function INSERT @retFindReports SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel FROM EMP_cte RETURN END; GO{/alert}标量函数{alert type="info"}IF OBJECT_ID (N'dbo.ufnGetInventoryStock', N'FN') IS NOT NULL DROP FUNCTION ufnGetInventoryStock; GO CREATE FUNCTION dbo.ufnGetInventoryStock(@ProductID int) RETURNS int AS -- Returns the stock level for the product. BEGIN DECLARE @ret int; SELECT @ret = SUM(p.Quantity) FROM Production.ProductInventory p WHERE p.ProductID = @ProductID AND p.LocationID = '6'; IF (@ret IS NULL) SET @ret = 0; RETURN @ret; END;SELECT ProductModelID, Name, dbo.ufnGetInventoryStock(ProductID)AS CurrentSupply FROM Production.Product WHERE ProductModelID BETWEEN 75 and 80;{/alert}系统函数
2022年11月14日
152 阅读
0 评论
0 点赞
2022-11-12
15. SQLServer : 存储过程
创建存储过程{callout color="#eee1ce"}存储过程的名称是区分大小写的,执行时需要注意使用SQL Server Management Studio创建存储过程中,在查询菜单中“指定模板参数的值(Ctrl+Shift+M)”补充模板信息,编写过程中使用“分析(Ctrl+F5)”进行检查和分析{/callout}{alert type="info"}-- 语法 CREATE [ OR ALTER ] { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ] [ { @parameter_name [ type_schema_name. ] data_type } [ VARYING ] [ = default ] [ OUT | OUTPUT | [READONLY] ] [ ,...n ] [ WITH <procedure_option> [ ,...n ] ] [ FOR REPLICATION ] AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] } [;] <procedure_option> ::= [ ENCRYPTION ] [ RECOMPILE ] [ EXECUTE AS Clause ]SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: 天祈 -- Create date: 2022-11-12 -- Description: 测试存储过程 -- ============================================= CREATE PROCEDURE [dbo].[Test2] ( -- Add the parameters for the stored procedure here @a int = 0, @b nvarchar = '') AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here SELECT @a, @b END GO{/alert}执行存储过程{alert type="info"}EXEC dbo.uspGetEmployeeManagers @BusinessEntityID = 50;{/alert}设置存储过程自执行{alert type="info"}打开SQL Server Management Studio,SQL Server代理–作业–点右键–新建作业定时自动执行SQL存储过程{/alert}指定参数{alert type="info"}USE AdventureWorks2012; GO -- Passing values as constants. EXEC dbo.uspGetWhereUsedProductID 819, '20050225'; GO -- Passing values as variables. DECLARE @ProductID int, @CheckDate datetime; SET @ProductID = 819; SET @CheckDate = '20050225'; EXEC dbo.uspGetWhereUsedProductID @ProductID, @CheckDate; GO -- Try to use a function as a parameter value. -- This produces an error message. EXEC dbo.uspGetWhereUsedProductID 819, GETDATE(); GO -- Passing the function value as a variable. DECLARE @CheckDate datetime; SET @CheckDate = GETDATE(); EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate; USE AdventureWorks2012; GO IF OBJECT_ID('Sales.uspGetSalesYTD', 'P') IS NOT NULL DROP PROCEDURE Sales.uspGetSalesYTD; GO CREATE PROCEDURE Sales.uspGetSalesYTD @SalesPerson nvarchar(50) = NULL -- NULL default value AS SET NOCOUNT ON; -- Validate the @SalesPerson parameter. IF @SalesPerson IS NULL BEGIN PRINT 'ERROR: You must specify the last name of the sales person.' RETURN END -- Get the sales for the specified sales person and -- assign it to the output parameter. SELECT SalesYTD FROM Sales.SalesPerson AS sp JOIN HumanResources.vEmployee AS e ON e.BusinessEntityID = sp.BusinessEntityID WHERE LastName = @SalesPerson; RETURN {/alert}参数{alert type="info"}输入参数允许调用方将数据值传递到存储过程或函数。输出参数允许存储过程将数据值或游标变量传递回调用方。 用户定义函数不能指定输出参数。每个存储过程向调用方返回一个整数返回代码。 如果存储过程没有显式设置返回代码的值,则返回代码为 0。{/alert}{alert type="info"}-- Create a procedure that takes one input parameter and returns one output parameter and a return code. CREATE PROCEDURE SampleProcedure @EmployeeIDParm INT, @MaxTotal INT OUTPUT AS -- Declare and initialize a variable to hold @@ERROR. DECLARE @ErrorSave INT SET @ErrorSave = 0 -- Do a SELECT using the input parameter. SELECT FirstName, LastName, JobTitle FROM HumanResources.vEmployee WHERE EmployeeID = @EmployeeIDParm -- Save any nonzero @@ERROR value. IF (@@ERROR <> 0) SET @ErrorSave = @@ERROR -- Set a value in the output parameter. SELECT @MaxTotal = MAX(TotalDue) FROM Sales.SalesOrderHeader; IF (@@ERROR <> 0) SET @ErrorSave = @@ERROR -- Returns 0 if neither SELECT statement had an error; otherwise, returns the last error. RETURN @ErrorSave{/alert}@@ERROR{alert type="info"}定义: 返回执行的上一个 Transact-SQL语句的错误号。注意事项: * 如果前一个T-SQL语句没有执行错误,则返回0 * 如果前一个语句遇到错误,则返回错误号。如果错误是 sys.messages 目录视图中的错误之一,则 @@ERROR 将包含 sys.messages.message_id 列中表示该错误的值。可以在 sys.messages 中查看与 @@ERROR 错误号相关的文本信息{/alert}返回数据使用结果集返回数据的示例{alert type="info"}USE AdventureWorks2019; GO IF OBJECT_ID('Sales.uspGetEmployeeSalesYTD', 'P') IS NOT NULL DROP PROCEDURE Sales.uspGetEmployeeSalesYTD; GO CREATE PROCEDURE Sales.uspGetEmployeeSalesYTD AS SET NOCOUNT ON; SELECT LastName, SalesYTD FROM Sales.SalesPerson AS sp JOIN HumanResources.vEmployee AS e ON e.BusinessEntityID = sp.BusinessEntityID; RETURN; GO {/alert}使用输出参数返回数据{alert type="info"}{/alert}
2022年11月12日
143 阅读
0 评论
0 点赞
2022-11-12
14. SQLServer : 游标学习
CLOSE{callout color="#f4ddbd"}释放当前结果集,然后解除定位游标的行上的游标锁定,从而关闭一个开放的游标。 CLOSE 将保留数据结构以便重新打开,但在重新打开游标之前,不允许提取和定位更新。 必须对打开的游标发布 CLOSE;不允许对仅声明或已关闭的游标执行 CLOSE。{/callout}{alert type="info"}DECLARE Employee_Cursor CURSOR FOR SELECT EmployeeID, Title FROM AdventureWorks2012.HumanResources.Employee; OPEN Employee_Cursor; FETCH NEXT FROM Employee_Cursor; WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM Employee_Cursor; END; CLOSE Employee_Cursor; DEALLOCATE Employee_Cursor; GO {/alert}DEALLOCATE{callout color="#91ec7e"}删除游标引用。 当释放最后的游标引用时,组成该游标的数据结构由 Microsoft SQL Server 释放。DEALLOCATE <@cursor_variable_name> 语句只删除对游标命名变量的引用。 直到批处理、存储过程或触发器结束时变量离开作用域,才释放变量。 在 DEALLOCATE <@cursor_variable_name> 语句之后,可以使用 SET 语句将变量与另一个游标关联。{/callout}{alert type="info"}-- DECLARE CURSOR 语句分配游标并将其与游标名称关联 DECLARE abc SCROLL CURSOR FOR SELECT * FROM Person.Person; -- 将游标设置为游标变量 DECLARE @MyCrsrRef CURSOR; SET @MyCrsrRef = abc; -- 不定义游标名称而创建游标并将其与变量关联 DECLARE @MyCursor CURSOR; SET @MyCursor = CURSOR LOCAL SCROLL FOR SELECT * FROM Person.Person; -- 示例 DECLARE @MyCursor CURSOR; SET @MyCursor = CURSOR LOCAL SCROLL FOR SELECT * FROM Sales.SalesPerson; DEALLOCATE @MyCursor; SET @MyCursor = CURSOR LOCAL SCROLL FOR SELECT * FROM Sales.SalesTerritory; GO -- 以下脚本显示游标如何持续到最后的名称或持续到引用它们的变量已释放 DECLARE abc CURSOR GLOBAL SCROLL FOR SELECT * FROM Sales.SalesPerson; OPEN abc; GO -- Reference the named cursor with a cursor variable. DECLARE @MyCrsrRef1 CURSOR; SET @MyCrsrRef1 = abc; -- Now deallocate the cursor reference. DEALLOCATE @MyCrsrRef1; -- Cursor abc still exists. FETCH NEXT FROM abc; GO -- Reference the named cursor again. DECLARE @MyCrsrRef2 CURSOR; SET @MyCrsrRef2 = abc; -- Now deallocate cursor name abc. DEALLOCATE abc; -- Cursor still exists, referenced by @MyCrsrRef2. FETCH NEXT FROM @MyCrsrRef2; -- Cursor finally is deallocated when last referencing -- variable goes out of scope at the end of the batch. GO -- Create an unnamed cursor. DECLARE @MyCursor CURSOR; SET @MyCursor = CURSOR LOCAL SCROLL FOR SELECT * FROM Sales.SalesTerritory; -- The following statement deallocates the cursor -- because no other variables reference it. DEALLOCATE @MyCursor; {/alert}DECLARE CURSOR{alert type="info"}ISO Syntax DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ] [;] Transact-SQL Extended Syntax DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF column_name [ ,...n ] ] ] [;] cursor_name : 游标的名称LOCAL : 指定该游标的范围对在其中创建它的批处理、存储过程或触发器是局部的GLOBAL : 指定该游标范围对连接是全局的。 在由此连接执行的任何存储过程或批处理中,都可以引用该游标名称。 该游标仅在断开连接时隐式释放。FORWARD_ONLY : 指定游标只能向前移动,并从第一行滚动到最后一行。STATIC : 指定游标始终以第一次打开时的样式显示结果集,并制作数据的临时副本,供游标使用。KEYSET : 指定当游标打开时,游标中行的成员身份和顺序已经固定。....{/alert}示例使用简单的游标和语法{callout color="#9483e7"}在打开该游标时所生成的结果集包括表中的所有行和所有列。 可以更新该游标,并且所有的更新和删除都会在对该游标所做的提取操作中表现出来。 FETCH NEXT 是唯一可用的提取选项,因为未指定 SCROLL 选项{/callout}{alert type="info"}DECLARE vend_cursor CURSOR FOR SELECT * FROM Purchasing.Vendor OPEN vend_cursor FETCH NEXT FROM vend_cursor; {/alert}
2022年11月12日
141 阅读
0 评论
0 点赞
2022-11-11
13. SQLServer : 常规命令
EXECUTE(简写EXEC)使用 EXECUTE 传递单个参数{alert type="info"}-- 执行存储过程 --EXEC dbo.uspGetEmployeeManagers @EmployeeID = 6; EXEC dbo.uspGetEmployeeManagers 6; -- 单个参数时不用声明 GO {/alert}使用多个参数{alert type="info"}DECLARE @CheckDate DATETIME; SET @CheckDate = GETDATE(); EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate; {/alert}EXECUTE 'tsql_string'{alert type="info"}declare @str nvarchar(255) = 'select * from Production.Product' EXECUTE(@str) {/alert}对远程存储过程使用 EXECUTE 语句{alert type="info"}DECLARE @retstat INT; EXECUTE @retstat = SQLSERVER1.AdventureWorks2012.dbo.uspGetEmployeeManagers @BusinessEntityID = 6; {/alert}使用带存储过程变量的 EXECUTE 语句{alert type="info"}DECLARE @proc_name VARCHAR(30); SET @proc_name = 'sys.sp_who'; EXEC @proc_name; {/alert}使用带 DEFAULT 的 EXECUTE{alert type="info"}-- 创建存储过程 IF OBJECT_ID(N'dbo.ProcTestDefaults', N'P')IS NOT NULL DROP PROCEDURE dbo.ProcTestDefaults; GO -- Create the stored procedure. CREATE PROCEDURE dbo.ProcTestDefaults ( @p1 SMALLINT = 42, @p2 CHAR(1), @p3 VARCHAR(8) = 'CAR') AS SET NOCOUNT ON; SELECT @p1, @p2, @p3 ; GO -- 执行存储过程 -- Specifying a value only for one parameter (@p2). EXECUTE dbo.ProcTestDefaults @p2 = 'A'; -- Specifying a value for the first two parameters. EXECUTE dbo.ProcTestDefaults 68, 'B'; -- Specifying a value for all three parameters. EXECUTE dbo.ProcTestDefaults 68, 'C', 'House'; -- Using the DEFAULT keyword for the first parameter. EXECUTE dbo.ProcTestDefaults @p1 = DEFAULT, @p2 = 'D'; -- Specifying the parameters in an order different from the order defined in the procedure. EXECUTE dbo.ProcTestDefaults DEFAULT, @p3 = 'Local', @p2 = 'E'; -- Using the DEFAULT keyword for the first and third parameters. EXECUTE dbo.ProcTestDefaults DEFAULT, 'H', DEFAULT; EXECUTE dbo.ProcTestDefaults DEFAULT, 'I', @p3 = DEFAULT; {/alert}对用户定义函数使用 EXECUTE{alert type="info"}DECLARE @returnstatus NVARCHAR(15); SET @returnstatus = NULL; EXEC @returnstatus = dbo.ufnGetSalesOrderStatusText @Status = 2; PRINT @returnstatus; GO {/alert}使用 EXECUTE 重新定义单个结果集{alert type="info"}-- 对存储过程的返回结果重新定义列 EXEC uspGetEmployeeManagers 6 WITH RESULT SETS ( ([Reporting Level] INT NOT NULL, [ID of Employee] INT NOT NULL, [Employee First Name] NVARCHAR(50) NOT NULL, [Employee Last Name] NVARCHAR(50) NOT NULL, [Employee ID of Manager] NVARCHAR(max) NOT NULL, [Manager First Name] NVARCHAR(50) NOT NULL, [Manager Last Name] NVARCHAR(50) NOT NULL ) ); {/alert}使用 EXECUTE 重新定义两个结果集{alert type="info"}CREATE PROC Production.ProductList @ProdName NVARCHAR(50) AS -- First result set SELECT ProductID, Name, ListPrice FROM Production.Product WHERE Name LIKE @ProdName; -- Second result set SELECT Name, COUNT(S.ProductID) AS NumberOfOrders FROM Production.Product AS P JOIN Sales.SalesOrderDetail AS S ON P.ProductID = S.ProductID WHERE Name LIKE @ProdName GROUP BY Name; GO -- Execute the procedure EXEC Production.ProductList '%tire%' WITH RESULT SETS ( (ProductID INT, -- first result set definition starts here Name NAME, ListPrice MONEY) , -- comma separates result set definitions (Name NAME, -- second result set definition starts here NumberOfOrders INT) ); {/alert}在运行时确定的名称调用存储过程{alert type="info"}EXEC ('EXEC ' + @var); {/alert}
2022年11月11日
147 阅读
0 评论
0 点赞
2022-11-11
12. SQLServer : 控制流
BEGIN...END{alert type="info"}-- BEGIN 和 END 定义一系列一起执行的 Transact-SQL 语句。 如果不包括 BEGIN...END 块,则将执行两个 ROLLBACK TRANSACTION 语句,并返回两条 PRINT 消息 USE AdventureWorks2012 GO BEGIN TRANSACTION GO IF @@TRANCOUNT = 0 BEGIN SELECT FirstName, MiddleName FROM Person.Person WHERE LastName = 'Adams'; ROLLBACK TRANSACTION; PRINT N'Rolling back the transaction two times would cause an error.'; END; ROLLBACK TRANSACTION; PRINT N'Rolled back the transaction.'; GO /* Rolled back the transaction. */ {/alert}BREAK{callout color="#a07df2"}BREAK 将退出当前 WHILE 循环。 如果当前循环嵌套在另一个循环中,BREAK 将只退出当前循环,并且将控制给予外部循环中的下一个语句。BREAK 通常位于 IF 语句中。{/callout}{alert type="info"}WHILE (1=1) BEGIN IF EXISTS (SELECT * FROM ##MyTempTable WHERE EventCode = 'Done') BEGIN BREAK; -- 'Done' row has finally been inserted and detected, so end this loop. END PRINT N'The other process is not yet done.'; -- Re-confirm the non-done status to the console. WAITFOR DELAY '00:01:30'; -- Sleep for 90 seconds. END{/alert}CONTINUE{callout color="#dcb174"}重新开始 WHILE 循环。 在 CONTINUE 关键字之后的任何语句都将被忽略。 CONTINUE 通常由一个 IF 测试打开,但并不始终这样。{/callout}{alert type="info"}DECLARE @m INT =1 WHILE (@m <= 10) BEGIN PRINT N'开始:'+ cast(@m as nvarchar(255)) IF @m = 3 BEGIN Set @m+=2 continue; END ELSE BEGIN Set @m+=1 END PRINT '@m:'+ cast(@m as nvarchar(255)) END select @m {/alert}IF...ELSE{alert type="info"}DECLARE @Number INT; SET @Number = 50; IF @Number > 100 PRINT 'The number is large.'; ELSE BEGIN IF @Number < 10 PRINT 'The number is small.'; ELSE PRINT 'The number is medium.'; END ; GO {/alert}GOTO{callout color="#beea6c"}将执行流更改到标签处。 跳过 GOTO 后面的 Transact-SQL 语句,并从标签位置继续处理。 GOTO 语句和标签可在过程、批处理或语句块中的任何位置使用。 GOTO 语句可嵌套使用。{/callout}{alert type="info"}DECLARE @Counter int; SET @Counter = 1; WHILE @Counter < 10 BEGIN SELECT @Counter SET @Counter = @Counter + 1 IF @Counter = 4 GOTO Branch_One --Jumps to the first branch. IF @Counter = 5 GOTO Branch_Two --This will never execute. END Branch_One: SELECT 'Jumping To Branch One.' GOTO Branch_Three; --This will prevent Branch_Two from executing. Branch_Two: SELECT 'Jumping To Branch Two.' Branch_Three: SELECT 'Jumping To Branch Three.'; {/alert}RETURN{callout color="#7496fb"}从查询或过程中无条件退出。 RETURN 的执行是即时且完全的,可在任何时候用于从过程、批处理或语句块中退出。 RETURN 之后的语句是不执行的。{/callout}{alert type="info"}CREATE PROCEDURE findjobs @nm sysname = NULL AS IF @nm IS NULL BEGIN PRINT 'You must give a user name' RETURN -- 之后的代码不会再执行 END ELSE BEGIN SELECT o.name, o.id, o.uid FROM sysobjects o INNER JOIN master..syslogins l ON o.uid = l.sid WHERE l.name = @nm END; {/alert}THROW{alert type="info"}-- 语法 THROW [ { error_number | @local_variable }, -- 状态 { message | @local_variable }, -- 错误信息 { state | @local_variable } ] -- 状态码 0 - 255 [ ; ] -- 示例 THROW 51000, 'The record does not exist.', 6; {/alert}TRY...CATCH{callout color="#84e3f0"} 如果 TRY 块内部发生错误,则会将控制传递给 CATCH 块中包含的另一个语句组。{/callout}{alert type="info"}-- 语法 BEGIN TRY { sql_statement | statement_block } END TRY BEGIN CATCH [ { sql_statement | statement_block } ] END CATCH [ ; ] -- 示例 BEGIN TRY -- Generate a divide-by-zero error. SELECT 1/0; END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_SEVERITY() AS ErrorSeverity ,ERROR_STATE() AS ErrorState ,ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine ,ERROR_MESSAGE() AS ErrorMessage; END CATCH; GO {/alert}WAITFOR{callout color="#8475f5"}阻止执行批处理、存储过程或事务,直到已过指定时间或时间间隔,或者指定语句发生修改或至少返回一行为止。{/callout}{alert type="info"}-- 语法 WAITFOR { DELAY 'time_to_pass' | TIME 'time_to_execute' | [ ( receive_statement ) | ( get_conversation_group_statement ) ] [ , TIMEOUT timeout ] } {/alert}WAITFOR TIME : 当时间某一刻时执行语句{alert type="info"}-- 在晚上 10:20 (22:20) 在 msdb 数据库中执行 sp_update_job 存储过程 EXECUTE sp_add_job @job_name = 'TestJob'; BEGIN WAITFOR TIME '22:20'; EXECUTE sp_update_job @job_name = 'TestJob', @new_name = 'UpdatedJob'; END; GO -- 只能是[时间]格式 BEGIN WAITFOR TIME '15:29:40' SELECT getdate() END{/alert}WAITFOR DELAY : 延迟指定时间之后运行语句{alert type="info"}-- 在两小时的延迟后执行存储过程 BEGIN WAITFOR DELAY '02:00'; BEGIN EXECUTE sp_helpdb; END END; GO {/alert}WHILE{callout color="#eccda2"}设置重复执行 SQL 语句或语句块的条件。 只要指定的条件为真,就重复执行语句。 可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。{/callout}{alert type="info"}USE AdventureWorks2012; GO WHILE (SELECT AVG(ListPrice) FROM Production.Product) < $300 BEGIN UPDATE Production.Product SET ListPrice = ListPrice * 2 SELECT MAX(ListPrice) FROM Production.Product IF (SELECT MAX(ListPrice) FROM Production.Product) > $500 BREAK ELSE CONTINUE END PRINT 'Too much for the market to bear';{/alert}
2022年11月11日
128 阅读
0 评论
0 点赞
2022-11-10
11. SQLServer : 运算符
运算符的优先级{callout color="#6eee5d"}如果一个表达式中的两个运算符有相同的优先级别,则按照它们在表达式中的位置对其从左到右进行求值。 例如,在下面的 SET 语句所使用的表达式中,在加运算符之前先对减运算符进行求值。{/callout}{alert type="info"} 级别 运算符 1 ~(位非) 2 *(乘)、/(除)、%(取模) 3 +(正)、-(负)、+(加)、+(串联)、-(减)、&(位与)、^(位异或)、|(位或) 4 =、><>=、<=、<>!=、!>!<(比较运算符) 5 NOT 6 AND 7 ALL、ANY、BETWEEN、IN、LIKE、OR、SOME 8 =(赋值) {/alert}一元运算符{alert type="info"} 运算符 含义 +(正) 数值为正。 -(负) 数值为负。 ~(位非) 返回数字的非。 {/alert}集运算符使用说明{alert type="info"}UNION ALL - 包括重复行UNION - 排除重复行{/alert}基本规则{alert type="info"}所有查询中的列数和列的顺序必须相同。数据类型必须兼容{/alert}算数运算符{alert type="info"}declare @mm int =3; declare @nn int =4; declare @zz nvarchar(255) ='5'; select -@nn+@mm -- 输出:-1 Set @mm += @mm -- 相当于: @mm = @mm + @mm print(@mm) -- 输出:6 print(@mm % @nn) -- 6 % 4 {/alert}比较运算符{alert type="info"} 运算符 含义 =(等于) 等于 >(大于) 大于 <(小于) 小于 >=(大于或等于) 大于等于 <=(小于或等于) 小于或等于 <>(不等于) 不等于 !=(不等于) 不等于(非 ISO 标准) !<(不小于) 不小于(非 ISO 标准) !>(不大于) 不大于(非 ISO 标准) {/alert}字符串运算符字符串串联{alert type="info"}DECLARE @x VARCHAR(4000) = REPLICATE('x', 4000) DECLARE @z VARCHAR(8000) = REPLICATE('z',8000) DECLARE @y VARCHAR(max); SET @y = ''; SET @y += @x + @z; SELECT LEN(@y) AS Y; -- 8000{/alert}通配符-百分比字符 %{alert type="success"}SELECT FirstName, LastName FROM Person.Person WHERE FirstName LIKE 'Dan%'; {/alert}通配符-中括号 []{alert type="info"}-- 返回以 m 字母开头的名称。 [n-z] 指定第二个字母必须是 n 到 z 范围内的某个字母 SELECT name FROM sys.databases WHERE name LIKE 'm[n-z]%'; -- 查找其地址中有四位邮政编码的所有 Adventure Works 雇员的 ID 和姓名 SELECT e.BusinessEntityID, p.FirstName, p.LastName, a.PostalCode FROM HumanResources.Employee AS e INNER JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID INNER JOIN Person.BusinessEntityAddress AS ea ON e.BusinessEntityID = ea.BusinessEntityID INNER JOIN Person.Address AS a ON a.AddressID = ea.AddressID WHERE a.PostalCode LIKE '[0-9][0-9][0-9][0-9]'; {/alert}通配符-无需匹配的字符串 ^{callout color="#676ed0"}匹配不在方括号 [^] 之间指定的范围或集合内的任何单个字符{/callout}{alert type="info"}-- 使用 [^] 运算符查找 Contact 表中名字以 Al 开头且第三个字母不是a的前5名用户 SELECT TOP 5 FirstName, LastName FROM Person.Person WHERE FirstName LIKE 'Al[^a]%'; -- 使用 [^] 运算符来查找不以字母或数字开头的字符串 SELECT [object_id], OBJECT_NAME(object_id) AS [object_name], name, column_id FROM sys.columns WHERE name LIKE '[^0-9A-z]%';{/alert}通配符- 下划线(匹配一个字符) _{alert type="info"}-- 返回以字母 m 开头且第三个字母为 d 的所有数据库名称 SELECT name FROM sys.databases WHERE name LIKE 'm_d%'; -- 返回 db_owner、db_ddladmin 等固定数据库角色的名称(此时的下划线被视为通配符) SELECT name FROM sys.database_principals WHERE name LIKE 'db_%'; -- 过滤出以 db_ 开头的数据库角色名(转义操作) SELECT name FROM sys.database_principals WHERE name LIKE 'db[_]%';{/alert}
2022年11月10日
152 阅读
0 评论
0 点赞
2022-10-09
Notion网页端汉化、主题修改
相关网址{alert type="info"}Notion官网登录网址GitHub notion-enhancernotion-enhancer使用文档-英文{/alert}网页端汉化安装Google插件NotionCn之后,当访问官网进行编辑的时候,会进行汉化操作设置主题安装Google插件notion-enhancer之后,在网页端选择了对应的黑色主题或者白色主题之下,在插件中themes栏选择主题启用即可,之后记得按提示刷新保存后记{callout color="#66dbea"}客户端汉化比较容易,但是想要修改主题的话,网上的方法殊途同归都会牵扯到notion-enhancer的本地安装,而由于Notion的不同版本、notion-enhancer的不同版本、npm包的不同版本、英文文档的理解阅读等,都缺少系统化的描述、花费了两天时间、很难整理出一个适合本地客户端的主题优化方案。不得不说的是,notion-enhancer安装过程中好多的Bug,版本的描述不清,支持的Notion版本不清楚、本身所支持的Notion到哪一个版本为之,这些都不清楚,需要自己一个个测试安装,最后筋疲力尽,还是安安心心用网页端吧,唉。。。。。{/callout}
2022年10月09日
707 阅读
0 评论
0 点赞
2022-10-05
10. SQLServer : 表达式
{alert type="info"}-- 语法 --Simple CASE expression: CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END --Searched CASE expression: CASE WHEN Boolean_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END -- 示例一 SELECT ProductNumber, Category = CASE ProductLine WHEN 'R' THEN 'Road' WHEN 'M' THEN 'Mountain' WHEN 'T' THEN 'Touring' WHEN 'S' THEN 'Other sale items' ELSE 'Not for sale' END, Name FROM Production.Product ORDER BY ProductNumber; GO --示例二 SELECT ProductNumber, Name, "Price Range" = CASE WHEN ListPrice = 0 THEN 'Mfg item - not for resale' WHEN ListPrice < 50 THEN 'Under $50' WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250' WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000' ELSE 'Over $1000' END FROM Production.Product ORDER BY ProductNumber ; {/alert}
2022年10月05日
179 阅读
0 评论
0 点赞
2022-10-05
9. SQLServer : 语言元素-控制流
BEGIN...END{callout color="#60ef4d"}包括一系列的 Transact-SQL 语句,从而可以执行一组 Transact-SQL 语句。 BEGIN 和 END 是控制流语言的关键字。{/callout}{alert type="success"}-- 语法 BEGIN { sql_statement | statement_block } END --示例 USE AdventureWorks2012 GO BEGIN TRANSACTION GO IF @@TRANCOUNT = 0 BEGIN SELECT FirstName, MiddleName FROM Person.Person WHERE LastName = 'Adams'; ROLLBACK TRANSACTION; PRINT N'Rolling back the transaction two times would cause an error.'; END; ROLLBACK TRANSACTION; PRINT N'Rolled back the transaction.'; GO /* Rolled back the transaction. */ {/alert}BREAK{callout color="#4defed"}BREAK 将退出当前 WHILE 循环。 如果当前循环嵌套在另一个循环中,BREAK 将只退出当前循环,并且将控制给予外部循环中的下一个语句。{/callout}{alert type="info"}WHILE (1=1) BEGIN IF EXISTS (SELECT * FROM ##MyTempTable WHERE EventCode = 'Done') BEGIN BREAK; -- 'Done' row has finally been inserted and detected, so end this loop. END PRINT N'The other process is not yet done.'; -- Re-confirm the non-done status to the console. WAITFOR DELAY '00:01:30'; -- Sleep for 90 seconds. END{/alert}ELSE (IF...ELSE){alert type="success"}-- 语法 IF Boolean_expression { sql_statement | statement_block } [ ELSE { sql_statement | statement_block } ] -- 示例一 IF 1 = 2 PRINT 'Boolean_expression is true.' ELSE PRINT 'Boolean_expression is false.' ; GO -- 示例二 USE AdventureWorks2012; GO IF (SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ) > 5 PRINT 'There are more than 5 Touring-3000 bicycles.' ELSE PRINT 'There are 5 or less Touring-3000 bicycles.' ; GO -- 示例三 USE AdventureWorks2012; GO DECLARE @AvgWeight DECIMAL(8,2), @BikeCount INT IF (SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ) > 5 BEGIN SET @BikeCount = (SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%'); SET @AvgWeight = (SELECT AVG(Weight) FROM Production.Product WHERE Name LIKE 'Touring-3000%'); PRINT 'There are ' + CAST(@BikeCount AS VARCHAR(3)) + ' Touring-3000 bikes.' PRINT 'The average weight of the top 5 Touring-3000 bikes is ' + CAST(@AvgWeight AS VARCHAR(8)) + '.'; END ELSE BEGIN SET @AvgWeight = (SELECT AVG(Weight) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ); PRINT 'Average weight of the Touring-3000 bikes is ' + CAST(@AvgWeight AS VARCHAR(8)) + '.' ; END ; GO -- 示例四 DECLARE @Number INT; SET @Number = 50; IF @Number > 100 PRINT 'The number is large.'; ELSE BEGIN IF @Number < 10 PRINT 'The number is small.'; ELSE PRINT 'The number is medium.'; END ; GO {/alert}GOTO{callout color="#4d75ef"}将执行流更改到标签处。 跳过 GOTO 后面的 Transact-SQL 语句,并从标签位置继续处理。 GOTO 语句和标签可在过程、批处理或语句块中的任何位置使用。 GOTO 语句可嵌套使用。{/callout}{alert type="success"}-- 语法 Define the label: label: Alter the execution: GOTO label -- 示例 DECLARE @Counter int; SET @Counter = 1; WHILE @Counter < 10 BEGIN SELECT @Counter SET @Counter = @Counter + 1 IF @Counter = 4 GOTO Branch_One --Jumps to the first branch. IF @Counter = 5 GOTO Branch_Two --This will never execute. END Branch_One: SELECT 'Jumping To Branch One.' GOTO Branch_Three; --This will prevent Branch_Two from executing. Branch_Two: SELECT 'Jumping To Branch Two.' Branch_Three: SELECT 'Jumping To Branch Three.'; {/alert}RETURN{callout color="#4def93"}从查询或过程中无条件退出。 RETURN 的执行是即时且完全的,可在任何时候用于从过程、批处理或语句块中退出。 RETURN 之后的语句是不执行的。{/callout}{alert type="success"}-- 示例一 CREATE PROCEDURE findjobs @nm sysname = NULL AS IF @nm IS NULL BEGIN PRINT 'You must give a user name' RETURN END ELSE BEGIN SELECT o.name, o.id, o.uid FROM sysobjects o INNER JOIN master..syslogins l ON o.uid = l.sid WHERE l.name = @nm END; -- 示例二 USE AdventureWorks2012; GO CREATE PROCEDURE checkstate @param VARCHAR(11) AS IF (SELECT StateProvince FROM Person.vAdditionalContactInfo WHERE ContactID = @param) = 'WA' RETURN 1 ELSE RETURN 2; GO {/alert}THROW{callout color="#4da1ef"}引发异常,并将执行转移到 TRY...CATCH 构造的 CATCH 块。{/callout}{alert type="success"}-- 语法 THROW [ { error_number | @local_variable }, { message | @local_variable }, { state | @local_variable } ] [ ; ] -- error_number : 表示异常的常量或变量 error_number 为 int,并且必须大于或等于50000且小于或等于2147483647 -- message : 描述异常的字符串或变量。 message 为 nvarchar(2048) -- State : 在 0 到 255 之间的常量或变量,指示与消息关联的状态。 state 为 tinyint -- 示例一 THROW 51000, 'The record does not exist.', 1; -- 示例二 USE tempdb; GO CREATE TABLE dbo.TestRethrow ( ID INT PRIMARY KEY ); BEGIN TRY INSERT dbo.TestRethrow(ID) VALUES(1); -- Force error 2627, Violation of PRIMARY KEY constraint to be raised. INSERT dbo.TestRethrow(ID) VALUES(1); END TRY BEGIN CATCH PRINT 'In catch block.'; THROW; END CATCH; {/alert}TRY...CATCH{alert type="success"}-- 语法 BEGIN TRY { sql_statement | statement_block } END TRY BEGIN CATCH [ { sql_statement | statement_block } ] END CATCH -- 示例 BEGIN TRY -- Generate a divide-by-zero error. SELECT 1/0; END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_SEVERITY() AS ErrorSeverity ,ERROR_STATE() AS ErrorState ,ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine ,ERROR_MESSAGE() AS ErrorMessage; END CATCH; {/alert}WHILE{callout color="#4dbfef"}设置重复执行 SQL 语句或语句块的条件。 只要指定的条件为真,就重复执行语句。 可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。{/callout}{alert type="success"}-- 示例 USE AdventureWorks2012; GO WHILE (SELECT AVG(ListPrice) FROM Production.Product) < $300 BEGIN UPDATE Production.Product SET ListPrice = ListPrice * 2 SELECT MAX(ListPrice) FROM Production.Product IF (SELECT MAX(ListPrice) FROM Production.Product) > $500 BREAK ELSE CONTINUE END PRINT 'Too much for the market to bear'; -- 示例二 WHILE ( SELECT AVG(ListPrice) FROM dbo.DimProduct) < $300 BEGIN UPDATE dbo.DimProduct SET ListPrice = ListPrice * 2; SELECT MAX ( ListPrice) FROM dbo.DimProduct IF ( SELECT MAX (ListPrice) FROM dbo.DimProduct) > $500 BREAK; END {/alert}
2022年10月05日
168 阅读
0 评论
0 点赞
2022-10-04
8. SQLServer : 变量
表达式NULLIF{callout color="#ef4dea"}如果两个表达式不相等,则 NULLIF 返回第一个表达式。如果表达式相等,则 NULLIF 返回第一个表达式类型的空值。{/callout}{alert type="success"}NULLIF ( expression , expression ) {/alert}变量{alert type="success"}-- 创建 int 类型的变量 DECLARE @MyCounter INT; -- 声明多个变量 DECLARE @LastName NVARCHAR(30), @FirstName NVARCHAR(20), @StateProvince NCHAR(2); -- 引用变量 DECLARE @MyVariable INT; SET @MyVariable = 1; SELECT BusinessEntityID, NationalIDNumber, JobTitle FROM HumanResources.Employee WHERE BusinessEntityID = @MyVariable; -- 赋值操作 DECLARE @EmpIDVariable INT; SELECT @EmpIDVariable = MAX(EmployeeID) FROM HumanResources.Employee; -- 如果 SELECT 语句返回多行且变量引用非标量表达式,则该变量将设置为结果集中最后一行中表达式的返回值 DECLARE @EmpIDVariable INT; SELECT @EmpIDVariable = BusinessEntityID FROM HumanResources.Employee ORDER BY BusinessEntityID DESC; SELECT @EmpIDVariable;{/alert}Set{callout color="#4def9b"}将先前使用DECLARE语句创建的指定局部变量设置为指定值{/callout}{alert type="success"}-- 赋值操作 DECLARE @myvar CHAR(20); SET @myvar = 'This is a test'; SELECT @myvar; -- 从查询中赋值 DECLARE @rows INT; SET @rows = (SELECT COUNT(*) FROM Sales.Customer); SELECT @rows; {/alert}SELECT{alert type="success"}-- 初始化赋值之后 使用select赋值 DECLARE @var1 VARCHAR(30); SELECT @var1 = 'Generic Name'; SELECT @var1 = [Name] FROM SalesLT.Product WHERE ProductID = 1000000; --Value does not exist SELECT @var1 AS 'ProductName';{/alert}DECLARE{callout color="#4def93"}变量是在批处理或过程的主体中用 DECLARE 语句声明的,并用 SET 或 SELECT 语句赋值。 游标变量可使用此语句声明,并可用于其他与游标相关的语句。 除非在声明中提供值,否则声明之后所有变量将初始化为 NULL。变量的名称。 变量名必须以 at 符 (@) 开头。 局部变量名称必须符合标识符规则。{/callout}
2022年10月04日
190 阅读
0 评论
1 点赞
2022-10-03
Notion客户端中文安装
{alert type="info"}Notion官网下载Notion汉化GitHub文件参考汉化教程当前版本为2.0.32{/alert}{alert type="success"}找到Notion安装文件位置C:\Users\你的用户名\AppData\Local\Programs\Notion\resources\app\renderer 把下载解压后的汉化文件notion-zh_CN.js放进去用文本编辑器打开目录下的preload.js,使用记事本都可以,拉到最后,添加一行代码require("./notion-zh_CN") ```` * 重启软件即可完成 {/alert}
2022年10月03日
438 阅读
0 评论
0 点赞
2022-09-30
失去
{alert type="success"}过去的时光浮光掠影 如同录像带一般播放着往昔 总是以为美好的现在还是漫长的很 做着未来可期的梦 真相却只是自我愚弄 自我下意识的刻意遗忘 我们有时候明明知道怎么做才是理智正确的 可是行动却是不能准确的跟上思绪 或者说是不愿意跟上 沉溺与已有的美好 身体上的惫懒懈怠和精神上自以为是的侥幸 蒙蔽了我们的双眼 没有看清此刻的满足和美好之下隐藏的险恶的沟壑与危险 在刀尖上起舞 只能看见自己的脚下 却永远看不见处在什么什么样的环境下 其中隐藏着什么的危险 当我们享受和埋头于眼下的美好之时 我们的心会被麻痹 会下意识的不去想 不去发现那些客观存在的隐患 当客观的现实降临的时候 幡然醒悟 后知后觉 因欲而生的人最是贪欢 小白二代逃出了自己的居所 撕咬开排水管道处设置的堵塞物 一跃而下 在五楼的位置 在我挨个投喂的时候 看见它的那处管道的堵塞物没有了 放置的饮水和食物也是没有消耗的痕迹 那个家伙本来已经很胖了 吃的不是很多 但是对水的需求还是很大的 这时候 我已经意识到可能发生了最糟糕的情况 掀起来它的窝的时候 杳无踪迹 只有四周布满撕咬的牙印在纸壳子的周围 那个管道的支口深邃而幽深 看不见一丝的光 也不清楚是什么时候发生的事情 后知后觉的我 一边自我忏悔 一边抱有一丝希望的奔向楼下 看看管道的出口是否在一楼 哪怕是得到一个重伤的它也好 然而一楼的四周没有管道出口 可以清楚的看到管道直通地下 然后当我前往地下二层之后 看到的时候错综复杂纵横交错的密密麻麻的管道 心当场就凉了半截 拔凉拔凉的 我尝试找到我们房间的那根排水管的根部连接的其他分支 可是 数米计的水泥和满目的更加细小的管道让我分不清东南西北中 如此高的楼层 摔下来的重伤或致死以及水分的缺失 让我很难相信它还或者 真正的死不见尸 一根毛都找不见了 不甘心的尝试寻找了好几次 明知没有希望还是祈求有丝许的可能 失落的返回 准备上班 看着满满的饮水器和食物 我知道 我永远失去它了 低头看着自己的双手 前日时在我手上玲珑可爱的样子历历在目 手感极好极好 温驯可爱 性格温和 比较粘人 也很贪吃胆小呢 可爱的小家伙 从它的母亲怀孕到出生一直在陪着它 看着它一天天长大 几乎每天都要抓到手里抚摸玩耍 写着写着 嘴角有了一丝笑意 毛绒绒的 可爱至极 来到这人间也接近一年 好东西都先紧着它吃 可还是觉得愧疚不安 如果我 把那个口子堵的严实一些 一段时间检查一次 可能情况就不一样了 人生中 真的是永远的缺少了重要的东西 本来还想着换工作的时候一起带走呢 没想到它却永远的留在了这里 看着一直满满的饮水器 看着满满的食盒 每次投喂的时候 驻足想起往昔 每次往里面再添一点水一点食物 即使我知道 它永远不可能回来了 终其一生 我不会忘记它带给我的欢乐{/alert}
2022年09月30日
154 阅读
0 评论
0 点赞
2022-09-23
MySQL配置文件my.ini说明
[client]、[mysql]、[mysqld]组说明{card-describe title="[clent]:客户端"}配置信息应用范围是所有的客户端,包括mysql、mysqladmin、mysqldump等{/card-describe}{card-describe title="[mysql]:mysql客户端"}配置信息只对mysql客户端生效。当客户端使用的配置在被重复配置时,下面的配置优先(下面的会覆盖上面的原则){/card-describe}{card-describe title="[mysqld]:服务端"}配置信息对服务端生效{/card-describe}配置信息{alert type="success"}[client] # 客户端连接服务器端时使用的端口号 port=3306 # 默认字符集 default-character-set=utf8 [mysqld] # 默认用户 user=root # 默认密码 password=123456 # MySQL 的安装路径 basedir=C:/Program Files/MySQL/MySQL Server 5.7/ # MySQL 数据文件的存储位置,也是数据表的存放位置 datadir=C:/ProgramData/MySQL/MySQL Server 5.7/Data # 服务端默认字符集 character-set-server=utf8 # 允许同时访问 MySQL 服务器的最大连接数 max_connections=100 # 查询时的缓存大小,缓存中可以存储以前通过 SELECT 语句查询过的信息,再次查询时就可以直接从缓存中拿出信息改善效率 query_cache_size=100 # 默认存储引擎 default-storage-engine=INNODB # 1开启,0关闭 将所有到达MySQL Server的SQL语句记录下来 general-log=0 # 设置日志文件保存位置 general_log_file="JOYWANG.log" # 慢查询日志是否开启1,0 slow-query-log=1 # 慢查询日志文件保存 slow_query_log_file="JOYWANG-slow.log" # 慢查询日志设置时间单位秒S long_query_time=10 # 是否启用错误日志的功能和错误日志的存储位置 log-error="JOYWANG.err" # 最大并发连接数,mysql会为每个连接提供缓冲区,会开销越多的内存,所以要适当的调整该值,不能盲目的提高设置值 max_connections=151 # 指定高速缓存的大小,每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容单位M table_open_cache=2000 # 增加一张临时表大小,提高查询速度 tmp_table_size=16M #线程池缓存大小,当客户端断开连接后,将当前线程缓存起来,当在接到新的连接请求时快速响应,无需创建新的线程 thread_cache_size=10 #MySQL重建索引时允许使用的临时文件最大大小 myisam_max_sort_file_size=100G #设置在REPAIR TABLE,或者用 CREATE INDEX 创建索引或 ALTER TABLE 的过程中排序索引所分配的缓冲区大小。可设置范围4Bytes 至 4GB,默认为8MB。 myisam_sort_buffer_size=8M #指定索引缓冲区的大小,决定了索引处理的速度,尤其是索引读的速度,建议设置成物理内存的1/4,甚至物理内存的30%-40%,如果设置太大,系统就会频繁的换页,降低系统性能 key_buffer_size=8M #MySQL读入缓冲区大小,对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。 read_buffer_size=0 #参数用在sort查询之后 ,以保证获取以顺序的方式获取到查询的数据。如果你有很多order by 查询语句,增长这值能够提升性能 read_rnd_buffer_size=0 #0:log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。 #1:每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去,该模式为系统默认。 #2:每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。 innodb_flush_log_at_trx_commit=1 #确保有足够大的日志缓冲区来保存脏数据在被写入到日志文件之前 innodb_log_buffer_size=1M #指定表数据和索引存储的空间,可以是一个或者多个文件。最后一个数据文件必须是自动扩充的,也只有最后一个文件允许自动扩充。这样,当空间用完后,自动扩充数据文件就会自动增长(以8MB为单位)以容纳额外的数据。例如: innodb_data_file_path=/disk1/ibdata1:900M;/disk2/ibdata2:50M:autoextend两个数据文件放在不同的磁盘上。数据首先放在ibdata1中,当达到900M以后,数据就放在ibdata2中。一旦达到50MB,ibdata2将以 8MB为单位自动增长。如果磁盘满了,需要在另外的磁盘上面增加一个数据文件。 innodb_data_file_path=/disk1/ibdata1:900M;/disk2/ibdata2:50M:autoextend #这是InnoDB最重要的设置,对InnoDB性能有决定性的影响。默认的设置只有8M,所以默认的数据库设置下面InnoDB性能很差。在只有InnoDB存储引擎的数据库服务器上面,可以设置60-80%的内存。更精确一点,在内存容量允许的情况下面设置比InnoDB tablespaces大10%的内存大小。 innodb_buffer_pool_size=8M #放置表空间数据的目录,默认在mysql的数据目录,设置到和MySQL安装文件不同的分区可以提高性能。 innodb_data_home_dir= #该参数决定了recovery speed。太大的话recovery就会比较慢,太小了影响查询性能,一般取256M可以兼顾性能和recovery的速度 innodb_log_file_size=48M #该参数设定了事务提交时内存中log信息的处理。 1) =1时,在每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的刷新。Truly ACID。速度慢。 2) =2时,在每个事务提交时,日志缓冲被写到文件, 但不对日志文件做到磁盘操作的刷新。只有操作系统崩溃或掉电才会删除最后一秒的事务,不然不会丢失事务。 3) =0时, 日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新。任何mysqld进程的崩溃会删除崩溃前最后一秒的事务 innodb_flush_logs_at_trx_commit=2 #设置InnoDB同步IO的方式: ) Default – 使用fsync()。 2) O_SYNC 以sync模式打开文件,通常比较慢。 3) O_DIRECT,在Linux上使用Direct IO。可以显著提高速度,特别是在RAID系统上。避免额外的数据复制和double buffering(mysql buffering 和OS buffering)。 innodb_flush_method=Default #InnoDB kernel最大的线程数。 1) 最少设置为(num_disks+num_cpus)*2。 2) 可以通过设置成1000来禁止这个限制 innodb_thread_concurrency=25 #此配置项作用主要是当tablespace 空间已经满了后,需要MySQL系统需要自动扩展多少空间,每次tablespace 扩展都会让各个SQL 处于等待状态。增加自动扩展Size可以减少tablespace自动扩展次数。 innodb_autoextend_increment=64 #可以开启多个内存缓冲池,把需要缓冲的数据hash到不同的缓冲池中,这样可以并行的内存读写。 innodb_buffer_pool_instances=8 #这个参数设置为一种tickets,默认是5000,我也不清楚到底它代表多久,从官方文档来看它和事物处理的行数有关,大事物需要处理的行数自然更多,小事物当然也就越少至少我们可以想成获得CPU的时间,干活期间他会不断减少,如果减少到0,这个线程将被提出innodb层次,进入前面说的等待队列,当然也就在队尾部了,这里假设有一个小的事物正在排队进入innodb层,又或者它已经进入了innodb层没有获得CPU时间轮片,突然一个大的事物tickets耗尽被提出了innodb层,那么这个小事物就自然而然能够获得CPU轮片干活,而小事物执行非常快,执行完成后,另外的事物又能尽快的获得CPU干活,不会由于OS线程调度不均匀的问题而造成的小事物饥饿问题,这很好理解。也就是前面我说的与其依赖OS的调度策略不如自己设置一种规则,让用到了一定时间轮片的线程先处于睡眠态放弃CPU的使用 innodb_concurrency_tickets=5000 innodb_old_blocks_time=1000 innodb_open_files=300 innodb_stats_on_metadata=0 #可以存储每个InnoDB表和它的索引在它自己的文件中。 innodb_file_per_table=1 #如果应用程序可以运行在READ-COMMITED隔离级别,做此设定会有一定的性能提升。 transaction-isolation=READ-COMITTED #这个参数用来表示 页读取到mid位置后,需要等待多久才会被加入到LRU列表的热端。使LRU列表中的热点数据不被刷出 innodb_checksum_algorithm=0 #MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中 back_log=80 flush_time=0 #如果按照检索的性能方式来细分,那么无论是两表 INNER JOIN 还是多表 INNER JOIN,都大致可以分为以下几类:1.JOIN KEY 有索引,主键2.JOIN KEY 有索引, 二级索引3.JOIN KEY 无索引;JOIN BUFFER 是 MySQL 用来缓存以上第二、第三这两类 JOIN 检索的一个 BUFFER 内存区域块。 join_buffer_size=256K #可以增大此值以便于server端接收更大的SQL max_allowed_packet=4M #同一主机最大连续请求错误次数,如果还没成功建立连接,mysql服务器会组织这台主机后续的所有请求 max_connect_errors=100 #限制mysqld能打开文件的最大数 open_files_limit=4161 #一个connection级参数,在每个connection第一次需要使用这个buffer的时候,一次性分配设置的内存 sort_buffer_size=256K #就是控制总frm文件的数量,还是个hash表,内部维护。如果打开的表实例的数量超过了table_definition_cache设置,LRU机制将开始标记表实例以进行清除,并最终将它们从数据字典缓存中删除。简单通俗点frm文件有多少,就设置多少了 table_definition_cache=1400 #指定基于行的二进制日志事件的最大大小 binlog_row_event_max_size=8K #本参数用于主从库中配置从库大于0作用为每个命令之后刷盘,小与0作为为永不刷盘,默认均为1000 sync_master_info=10000 #这个参数和sync_binlog是一样的,当设置为1时,slave的I/O线程每次接收到master发送过来的binlog日志都要写入系统缓冲区,然后刷入relay log中继日志里,这样是最安全的,因为在崩溃的时候,你最多会丢失一个事务,但会造成磁盘的大量I/O。当设置为0时,并不是马上就刷入中继日志里,而是由操作系统决定何时来写入,虽然安全性降低了,但减少了大量的磁盘I/O操作。这个值默认是0,可动态修改,建议采用默认值。 sync_relay_log=10000 #这个参数和sync_relay_log参数一样,当设置为1时,slave的I/O线程每次接收到master发送过来的binlog日志都要写入系统缓冲区,然后刷入relay-log.info里,这样是最安全的,因为在崩溃的时候,你最多会丢失一个事务,但会造成磁盘的大量I/O。当设置为0时,并不是马上就刷入relay-log.info里,而是由操作系统决定何时来写入,虽然安全性降低了,但减少了大量的磁盘I/O操作。这个值默认是0,可动态修改,建议采用默认值 sync_relay_log_info=10000 {/alert}
2022年09月23日
192 阅读
0 评论
0 点赞
2022-09-20
7. SQLServer : 其他函数(JSON函数、逻辑函数、聚合函数、排名函数、配置)
JSON函数相关(SQLServer16及以上)ISJSON :测试字符串是否包含有效JSON{alert type="success"}select ISJSON('{"a":1,"b":2}'); -- 1 : true 0:fasle{/alert}JSON_VALUE : 从字符串中提取标量值{alert type="success"}select json_value('{"a":1,"b":2,"c":{"cc":3}}','$.b'); -- 2 select json_value('{"a":1,"b":2,"c":{"cc":3}}','$.c.cc'); -- 3{/alert}JSON_QUERY : 从 JSON 字符串中提取对象或数组{callout color="#4fef4d"}如果值不是对象或者数组、会报错或者返回NULL{/callout}{alert type="success"}select JSON_QUERY('{"a":1,"b":2,"c":{"cc":3}}','$.c.cc'); -- Null select JSON_QUERY('{"a":1,"b":2,"c":{"cc":3}}','$.c'); -- {"cc":3}{/alert}JSON_MODIFY : 更新 JSON 字符串中属性的值,并返回已更新的 JSON 字符串{alert type="success"}-- 语法 JSON_MODIFY ( expression , path , newValue ) -- 示例 select JSON_MODIFY('{"a":1,"b":2,"c":{"cc":3}}','$.c','{dd:4}'); -- {"a":1,"b":2,"c":"{dd:4}"}{/alert}将JSON 集合转换为行集{callout color="#9aaaea"}如果必须基于 JSON 数据创建查询或报表,可以通过调用 OPENJSON 行集函数,轻松地将 JSON 数据转换为行与列 。{/callout}{alert type="info"}DECLARE @json NVARCHAR(MAX); SET @json = N'[ {"id": 2, "info": {"name": "John", "surname": "Smith"}, "age": 25}, {"id": 5, "info": {"name": "Jane", "surname": "Smith"}, "dob": "2005-11-04T12:00:00"} ]'; SELECT * FROM OPENJSON(@json) WITH ( id INT 'strict $.id', firstName NVARCHAR(50) '$.info.name', lastName NVARCHAR(50) '$.info.surname', age INT, dateOfBirth DATETIME2 '$.dob' ); DECLARE @json NVARCHAR(MAX); SET @json = N'[ {"id": 2, "info": {"name": "John", "surname": "Smith"}, "age": 25}, {"id": 5, "info": {"name": "Jane", "surname": "Smith", "skills": ["SQL", "C#", "Azure"]}, "dob": "2005-11-04T12:00:00"} ]'; SELECT id, firstName, lastName, age, dateOfBirth, skill FROM OPENJSON(@json) WITH ( id INT 'strict $.id', firstName NVARCHAR(50) '$.info.name', lastName NVARCHAR(50) '$.info.surname', age INT, dateOfBirth DATETIME2 '$.dob', skills NVARCHAR(MAX) '$.info.skills' AS JSON ) OUTER APPLY OPENJSON(skills) WITH (skill NVARCHAR(8) '$');{/alert}将 SQL Server 数据转换为 JSON 或导出 JSON{alert type="info"}SELECT id, firstName AS "info.name", lastName AS "info.surname", age, dateOfBirth AS dob FROM People FOR JSON PATH;{/alert}OPENJSON{alert type="info"}在不提供结果的显式架构的情况下使用 OPENJSON 函数时(即,在 OPENJSON 之后不使用 WITH 子句),该函数将返回包含以下三列的表:输入对象中属性的名称(或输入数组中元素的索引)。属性或数组元素的值。类型(例如,字符串、数字、布尔值、数组或对象)。OPENJSON 以单独的行返回 JSON 对象的每个属性或数组的每个元素。{/alert}具有默认输出的 OPENJSON{alert type="info"}下面是使用具有默认架构(即不包含可选的 WITH 子句)的 OPENJSON 的快捷示例,该示例为 JSON 对象的每个属性返回一行。 {/alert}{alert type="info"}DECLARE @json NVARCHAR(MAX) SET @json='{"name":"John","surname":"Doe","age":45,"skills":["SQL","C#","MVC"]}'; SELECT * FROM OPENJSON(@json);{/alert}具有显式结构的 OPENJSON 输出{alert type="info"}如果使用 OPENJSON 函数的 WITH 子句指定结果的架构,该函数返回的表只包含 WITH 子句中定义的列。 在可选的 WITH 子句中,指定一组输出列、列类型和每个输出值的 JSON 源属性的路径。 OPENJSON 循环访问 JSON 对象的数组,读取每一列的指定路径上的值,并将值转换为指定类型。{/alert}{alert type="info"}DECLARE @json NVARCHAR(MAX) SET @json = N'[ { "Order": { "Number":"SO43659", "Date":"2011-05-31T00:00:00" }, "AccountNumber":"AW29825", "Item": { "Price":2024.9940, "Quantity":1 } }, { "Order": { "Number":"SO43661", "Date":"2011-06-01T00:00:00" }, "AccountNumber":"AW73565", "Item": { "Price":2024.9940, "Quantity":3 } } ]' SELECT * FROM OPENJSON ( @json ) WITH ( Number varchar(200) '$.Order.Number' , Date datetime '$.Order.Date', Customer varchar(200) '$.AccountNumber', Quantity int '$.Item.Quantity' ) {/alert}返回对象的各个属性{alert type="info"}-- 原始 SELECT * FROM OPENJSON('{"name":"John","surname":"Doe","age":45}') -- 分析 SELECT * FROM OPENJSON('{"name":"John","surname":"Doe","age":45}') with ( name nvarchar(255), surname nvarchar(255), age nvarchar(255) ) {/alert}返回数组各元素{alert type="info"}SELECT * FROM OPENJSON('["en-GB", "en-UK","de-AT","es-AR","sr-Cyrl"]') {/alert}将 JSON 转换成临时表{alert type="info"}-- 以下查询返回 info 对象的所有属性 DECLARE @json NVARCHAR(MAX) SET @json=N'{ "info":{ "type":1, "address":{ "town":"Bristol", "county":"Avon", "country":"England" }, "tags":["Sport", "Water polo"] }, "type":"Basic" }' SELECT * FROM OPENJSON(@json,N'lax $.info'){/alert}使用 WITH 子句设置输出格式{alert type="info"}DECLARE @json NVARCHAR(MAX) = N'{"someObject": {"someArray": [ {"k1": 11, "k2": null, "k3": "text"}, {"k1": 21, "k2": "text2", "k4": { "data": "text4" }}, {"k1": 31, "k2": 32}, {"k1": 41, "k2": null, "k4": { "data": false }} ] } }' SELECT * FROM OPENJSON(@json, N'lax $.someObject.someArray') WITH ( k1 int, k2 varchar(100), col3 varchar(6) N'$.k3', col4 varchar(10) N'lax $.k4.data', col5 nvarchar(MAX) N'lax $.k4' AS JSON, array_element nvarchar(MAX) N'$' AS JSON ) {/alert}使用 FOR JSON 将查询结果格式化为 JSON{alert type="info"}使用 FOR JSON PATH 来保持对 JSON 输出格式的完全控制。 你可以创建包装对象并嵌套复杂属性。若要根据 SELECT 语句的结构自动格式化 JSON 输出,请使用 FOR JSON AUTO。{/alert}{alert type="info"}SELECT name, surname FROM emp FOR JSON AUTO;{/alert}聚合函数AVG : 平均值计算{alert type="info"}-- 语法 AVG ( [ ALL | DISTINCT ] expression ) [ OVER ( [ partition_by_clause ] order_by_clause ) ]{/alert}搭配 GROUP BY 子句使用 SUM 和 AVG 函数{alert type="info"}SELECT TerritoryID, AVG(Bonus)as 'Average bonus', SUM(SalesYTD) as 'YTD sales' FROM Sales.SalesPerson GROUP BY TerritoryID; GO {/alert}带 DISTINCT 使用 AVG{callout color="#f0ad4e"}DISTINCT剔除字段中重复值{/callout}{alert type="info"}SELECT AVG(DISTINCT ListPrice) FROM Production.Product; SELECT AVG(ListPrice) FROM Production.Product; {/alert}使用 OVER 子句{callout color="#4def86"}{/callout}{alert type="success"}SELECT BusinessEntityID, TerritoryID ,DATEPART(yy,ModifiedDate) AS SalesYear ,CONVERT(VARCHAR(20),SalesYTD,1) AS SalesYTD ,CONVERT(VARCHAR(20),AVG(SalesYTD) OVER (PARTITION BY TerritoryID ORDER BY DATEPART(yy,ModifiedDate) ),1) AS MovingAvg ,CONVERT(VARCHAR(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID ORDER BY DATEPART(yy,ModifiedDate) ),1) AS CumulativeTotal FROM Sales.SalesPerson WHERE TerritoryID IS NULL OR TerritoryID < 5 ORDER BY TerritoryID,SalesYear; {/alert}COUNT{alert type="info"}-- 语法 -- Aggregation Function Syntax COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } ) -- Analytic Function Syntax COUNT ( [ ALL ] { expression | * } ) OVER ( [ <partition_by_clause> ] ) {/alert}使用 COUNT 和 DISTINCT{alert type="success"}SELECT COUNT(DISTINCT Title) FROM HumanResources.Employee; {/alert}使用 COUNT(*){alert type="success"}SELECT COUNT(*) FROM HumanResources.Employee; {/alert}使用OVER子句{alert type="success"}SELECT DISTINCT Name , MIN(Rate) OVER (PARTITION BY edh.DepartmentID) AS MinSalary , MAX(Rate) OVER (PARTITION BY edh.DepartmentID) AS MaxSalary , AVG(Rate) OVER (PARTITION BY edh.DepartmentID) AS AvgSalary ,COUNT(edh.BusinessEntityID) OVER (PARTITION BY edh.DepartmentID) AS EmployeesPerDept FROM HumanResources.EmployeePayHistory AS eph JOIN HumanResources.EmployeeDepartmentHistory AS edh ON eph.BusinessEntityID = edh.BusinessEntityID JOIN HumanResources.Department AS d ON d.DepartmentID = edh.DepartmentID WHERE edh.EndDate IS NULL ORDER BY Name; {/alert}MAX、MIN、SUM{alert type="success"}-- 语法 -- Aggregation Function Syntax MAX( [ ALL | DISTINCT ] expression ) -- Analytic Function Syntax MAX ([ ALL ] expression) OVER ( <partition_by_clause> [ <order_by_clause> ] ) {/alert}{alert type="info"}SELECT DISTINCT Name , MIN(Rate) OVER (PARTITION BY edh.DepartmentID) AS MinSalary , MAX(Rate) OVER (PARTITION BY edh.DepartmentID) AS MaxSalary , AVG(Rate) OVER (PARTITION BY edh.DepartmentID) AS AvgSalary ,COUNT(edh.BusinessEntityID) OVER (PARTITION BY edh.DepartmentID) AS EmployeesPerDept FROM HumanResources.EmployeePayHistory AS eph JOIN HumanResources.EmployeeDepartmentHistory AS edh ON eph.BusinessEntityID = edh.BusinessEntityID JOIN HumanResources.Department AS d ON d.DepartmentID = edh.DepartmentID WHERE edh.EndDate IS NULL ORDER BY Name; {/alert}配置{alert type="info"}配置说明@@DBTS当前数据库的当前 timestamp 数据类型的值@@LANGUAGE当前所用语言的名称@@MAX_CONNECTIONS允许同时进行的最大用户连接数@@MAX_PRECISION返回 decimal 和 numeric 数据类型所用的精度级别@@SERVERNAME运行 SQL Server 的本地服务器的名称@@SPID返回当前用户进程的会话 ID@@VERSION当前 SQL Server 安装的系统和生成信息{/alert}逻辑函数CHOOSE{callout color="#f0ad4e"}在 SQL Server 中从值列表返回指定索引处的项。{/callout}{alert type="success"}SELECT CHOOSE ( 3, 'Manager', 'Director', 'Developer', 'Tester' ) AS Result; SELECT Name, ModifiedDate, CHOOSE(MONTH(ModifiedDate),'Winter','Winter', 'Spring','Spring','Spring','Summer','Summer', 'Summer','Autumn','Autumn','Autumn','Winter') AS Quarter_Modified FROM SalesLT.ProductModel AS PM WHERE Name LIKE '%Frame%' ORDER BY ModifiedDate; {/alert}IIF{alert type="success"}-- 如果布尔表达式为 true,则返回 true_value;如果布尔表达式为 false 或未知,则返回 false_value IIF( boolean_expression, true_value, false_value ) DECLARE @P INT = NULL, @S INT = NULL; SELECT [Result] = IIF( 45 > 30, @P, @S );{/alert}排名函数{callout color="#4def6d"}排名函数为分区中的每一行返回一个排名值。根据所使用的函数,某些行可能会收到与其他行相同的值。排名函数是不确定的。{/callout}{alert type="success"}SELECT p.FirstName, p.LastName ,ROW_NUMBER() OVER (ORDER BY a.PostalCode) AS "Row Number" ,RANK() OVER (ORDER BY a.PostalCode) AS Rank ,DENSE_RANK() OVER (ORDER BY a.PostalCode) AS "Dense Rank" ,NTILE(4) OVER (ORDER BY a.PostalCode) AS Quartile ,s.SalesYTD ,a.PostalCode FROM Sales.SalesPerson AS s INNER JOIN Person.Person AS p ON s.BusinessEntityID = p.BusinessEntityID INNER JOIN Person.Address AS a ON a.AddressID = p.BusinessEntityID WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0; FirstName LastName Row Number Rank Dense Rank Quartile SalesYTD PostalCode Michael Blythe 1 1 1 1 4557045.0459 98027 Linda Mitchell 2 1 1 1 5200475.2313 98027 Jillian Carson 3 1 1 1 3857163.6332 98027 Garrett Vargas 4 1 1 1 1764938.9859 98027 Tsvi Reiter 5 1 1 2 2811012.7151 98027 Shu Ito 6 6 2 2 3018725.4858 98055 José Saraiva 7 6 2 2 3189356.2465 98055 David Campbell 8 6 2 3 3587378.4257 98055 Tete Mensa-Annan 9 6 2 3 1931620.1835 98055 Lynn Tsoflias 10 6 2 3 1758385.926 98055 Rachel Valdez 11 6 2 4 2241204.0424 98055 Jae Pak 12 6 2 4 5015682.3752 98055 Ranjit Varkey Chudukatil 13 6 2 4 3827950.238 98055 {/alert}DENSE_RANK{callout color="#f788c3"}此函数返回结果集分区中每行的排名,排名值没有间断。 特定行的排名等于该特定行之前不同排名值的数量加一。{/callout}{alert type="success"}-- 语法 DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > ) SELECT i.ProductID, p.Name, i.LocationID, i.Quantity ,DENSE_RANK() OVER (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS Rank FROM Production.ProductInventory AS i INNER JOIN Production.Product AS p ON i.ProductID = p.ProductID WHERE i.LocationID BETWEEN 3 AND 4 ORDER BY i.LocationID; {/alert}RANK{callout color="#f0ad4e"}返回结果集分区内每一行的排名。行的排名是相关行之前的排名数加1{/callout}{alert type="success"}RANK ( ) OVER ( [ partition_by_clause ] order_by_clause ) {/alert}NTILE{callout color="#4defdd"}将有序分区中的行分发到指定数目的组中。 各个组有编号,编号从一开始。 对于每一个行,NTILE 将返回此行所属的组的编号。{/callout}{alert type="success"}NTILE (integer_expression) OVER ( [ <partition_by_clause> ] < order_by_clause > ) SELECT p.FirstName, p.LastName ,NTILE(4) OVER(ORDER BY SalesYTD DESC) AS Quartile ,CONVERT(NVARCHAR(20),s.SalesYTD,1) AS SalesYTD , a.PostalCode FROM Sales.SalesPerson AS s INNER JOIN Person.Person AS p ON s.BusinessEntityID = p.BusinessEntityID INNER JOIN Person.Address AS a ON a.AddressID = p.BusinessEntityID WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0; {/alert}ROW_NUMBER{callout color="#4defdd"}对结果集的输出进行编号。更具体地说,返回结果集分区内行的序号,每个分区中的第一行从 1 开始。ROW_NUMBER并且RANK是相似的。ROW_NUMBER按顺序编号所有行(例如 1、2、3、4、5)。RANK为平局提供相同的数值(例如 1、2、2、4、5)。{/callout}{alert type="info"}ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause ) {/alert}
2022年09月20日
245 阅读
0 评论
1 点赞
2022-09-18
TypeScript编译安装
npm install -g typescript npm install gulp-typescript -D// gulpfile.js var ts = require('gulp-typescript'); gulp.task('watch', function () { //sass监听 gulp.watch('src/css/sass/*.scss', function () { return gulp .src('src/css/sass/*.scss') .pipe(sass()) .pipe(gulp.dest('dist/css')); }); //less监听 gulp.watch('src/css/less/*.less', function () { return gulp .src('src/css/less/*.less') .pipe(less()) .pipe(gulp.dest('dist/css/')); }); // Typescript gulp.watch('src/js/ts/*.ts', function () { return gulp.src('src/js/ts/*.ts').pipe(ts()).pipe(gulp.dest('dist/js/')); }); });
2022年09月18日
197 阅读
0 评论
0 点赞
2022-09-13
Less扩展语言编译安装
Less转CSS{callout color="#4defb9"}首先可以引入使用less.js将less解释为css样式。也可以使用命令行转换的方式进行.less文件向.css文件的转换,可以使用gulp构建工具中的gulp-less进行自动转换{/callout}{alert type="info"}const gulp = require('gulp'); var less = require('gulp-less'); //less var sass = require('gulp-sass')(require('sass')); //sass var scss = require('gulp-scss'); //scss var ts = require('gulp-typescript'); //文件监听 gulp.task('watch', function () { //sass监听 gulp.watch('src/css/sass/*.scss', function () { return gulp .src('src/css/sass/*.scss') .pipe(sass()) .pipe(gulp.dest('dist/css')); }); //less监听 gulp.watch('src/css/less/*.less', function () { return gulp .src('src/css/less/*.less') .pipe(less()) .pipe(gulp.dest('dist/css/')); }); });{/alert}语法实践变量{alert type="success"}@width: 10px; @height: @width + 10px; #header { width: @width; height: @height; }{/alert}
2022年09月13日
143 阅读
0 评论
1 点赞
2022-09-13
前端模块基本插件包
NodeJS{alert type="success"}删除文件npm install del -D npm install clean -D复制文件npm install --save copy压缩文件npm install --save copy反向代理、跨域npm i http-proxy-middleware{/alert}Gulp{alert type="info"}删除文件npm install --save-dev gulp-clean复制文件npm i gulp-copy -D压缩文件npm i uglify -D合并文件npm i gulp-concat -D压缩CSSnpm install gulp-cssnano --save-dev npm install --save-dev gulp-cssmin压缩图片$ npm install --save-dev gulp-imageminHTML文件压缩npm install --save gulp-htmlminSCSS转CSS{callout color="#f0ad4e"}.scss文件或者.sass文件不能以下划线为文件名开头,否则会出错{/callout}npm install --save sass gulp-sass npm install --save gulp-scss{/alert}Grunt{alert type="success"}删除文件npm install grunt-contrib-clean --save-dev复制文件npm i grunt-contrib-copy -D压缩文件npm i grunt-contrib-uglify -D合并文件npm i grunt-contrib-concat -D压缩CSSnpm i grunt-contrib-cssmin -D压缩图片npm install --save-dev grunt-contrib-imageminHTML文件压缩npm install grunt-contrib-htmlmin --save-dev{/alert}
2022年09月13日
121 阅读
0 评论
0 点赞
2022-09-13
Grunt自动化构建工具
安装npm install grunt -D npm install grunt-cli -g
2022年09月13日
106 阅读
0 评论
0 点赞
2022-09-12
Gulp:前端自动化构建工具
gulp安装npm install gulp gulp-cli -D新建配置文件根目录下新建gulpfile.js文件const gulp = require('gulp'); // var path = require('path'); const babel = require('gulp-babel'); //babel转码 var less = require('gulp-less'); //less var sass = require('gulp-sass')(require('sass')); //sass const eslint = require('gulp-eslint'); var browserify = require('gulp-browserify'); //browserify var ts = require('gulp-typescript'); //babel转码; gulp.task('babel', function () { return gulp .src('src/**/*.js') .pipe( babel({ presets: ['@babel/env'], }) ) .pipe(gulp.dest('lib')); }); //less编译 gulp.task('less', function () { return gulp.src('src/less/**/*.less').pipe(less()).pipe(gulp.dest('lib/css')); //sass编译 gulp.task('sass', function () { return gulp.src('src/sass/**/*.scss').pipe(sass()).pipe(gulp.dest('lib/css')); }); //eslint gulp.task('eslint', () => { return gulp .src(['src/js/**/*.js']) .pipe(eslint()) .pipe(eslint.format()) .pipe(eslint.failAfterError()); }); // Basic usage gulp.task('build', function () { // Single entry point to browserify return gulp.src('lib/js/app.js').pipe(browserify()).pipe(gulp.dest('./dist')); }); //文件监听 gulp.task('watch', function () { //sass监听 gulp.watch('src/sass/**/*.scss', function () { return gulp .src('src/sass/**/*.scss') .pipe(sass()) .pipe(gulp.dest('lib/css')); }); //less监听 gulp.watch('src/less/**/*.less', function () { return gulp .src('src/less/**/*.less') .pipe(less()) .pipe(gulp.dest('lib/css')); }); //babel转译 gulp.watch('src/js/**/*.js', function () { return gulp .src('src/js/**/*.js') .pipe( babel({ presets: ['@babel/env'], }) ) .pipe(gulp.dest('lib/js')); }); //监听整个src gulp.watch('lib/js/app.js', function () { return gulp .src('lib/js/app.js') .pipe(browserify()) .pipe(gulp.dest('./dist')); }); // TypeScript gulp.watch('src/js/ts/*.ts', function () { return gulp.src('src/js/ts/*.ts').pipe(ts()).pipe(gulp.dest('dist/js/')); }); });
2022年09月12日
193 阅读
0 评论
0 点赞
1
2
...
4