SqlServer Database Daily Operation Manual

add field

alter table PM_ChangeColor add Status nvarchar(50) default '申请中';

Modify field type

Alter table PM_AfterDyePlan Alter column BlowingRate nvarchar(50)

Delete field

alter table PM_DyePlan drop column SolidWashingMethod

add index

CREATE NONCLUSTERED INDEX [index_PM_ChangeColor_Status] ON PM_ChangeColor
(
	[Status] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

unique index

CREATE UNIQUE NONCLUSTERED INDEX [UQ_PM_ChangeColor_Status] ON PM_ChangeColor
(
 [Status]
) ON [PRIMARY]

combined primary key

--先设置非空约束
Alter table PM_BatchNoColorNoRemark alter column sMaterialLot nvarchar(50) not null 
Alter table PM_BatchNoColorNoRemark alter column utmColorGUID uniqueidentifier not null 
--增加主键
Alter table PM_BatchNoColorNoRemark add constraint pk_PM_BatchNoColorNoRemark primary key(sMaterialLot, utmColorGUID)

Group ranking

select A.upbWorkingProcedureGUID,A.CreateDate,RANK() over(partition by A.upbWorkingProcedureGUID order by A.CreateDate) SortCode from PM_WorkPlanLog A

Group sorting

select A.upbWorkingProcedureGUID,A.CreateDate,row_number() over(partition by A.upbWorkingProcedureGUID order by A.CreateDate) SortCode from PM_WorkPlanLog A

Stored procedure transaction code block

BEGIN TRY---------------------开始捕捉异常
    BEGIN TRAN------------------开始事务
       --程序逻辑
    COMMIT TRAN -------提交事务
END TRY-----------结束捕捉异常
BEGIN CATCH------------有异常被捕获
        IF @@TRANCOUNT > 0---------------判断有没有事务
        BEGIN
            ROLLBACK TRAN----------回滚事务
        END
        -----------执行存储过程将错误信息记录在表当中
END CATCH--------结束异常处理

Cross-database query (optimized version)

By connecting to the server for cross-database dynamic query and inserting into the temporary table (to improve efficiency), the cross-database query is directly spliced ​​without indexing, so dynamic splicing SQL is used to index it to improve efficiency.

DECLARE @V_Sql varchar(max) = ''

select A.* 
into #result
from
(
	select '001' as Id
	union all
	select '002' as Id
)A

select @V_Sql = 'select A.Id,A.Name from [127.0.01].[DB_NAME].[dbo].User A  
where  A.Id in (' + SUBSTRING(A.whereIn,0,LEN(A.whereIn)) +')
'  from 
(
	SELECT 
	(
		SELECT ''''+ A1.Id +''',' FROM #result A1 WHERE 1=1 FOR XML PATH(''),TYPE
    ).value('.','NVARCHAR(MAX)') as whereIn
)A

create table #tmp_table
(
 Id varchar(50),Name varchar(50)
)

insert into #tmp_table(Id,Name)
exec (''+ @V_Sql + '')

Convert table to json

INCLUDE_NULL_VALUES--为空的字段也放出来
WITHOUT_ARRAY_WRAPPER--去掉最外面的[]
left join 可以直接变成表体,或者直接在字段中select一个表
PATH会生成单个对象,AUTO会生成数组[]
如果你在生成的json对象中发现了带有\"的情况,那是因为转义字符被自动添加了。你可以使用JSON_QUERY函数来解决这个问题。

declare @V_json varchar(max) = ''

set @V_json = (					
select A.*
,A.prevProcessName AS [customCode.RQGX]
,A.nextProcessName AS [customCode.HZLFS]
,(SELECT moBillNo,moId FROM #tmp_mainMessageList FOR JSON AUTO) AS mergeMOList
,JSON_QUERY((SELECT moBillNo,moId FROM #tmp_mainMessageList FOR JSON AUTO)) AS mergeMOList1
from #tmp_mainMessage A  					
FOR JSON PATH,INCLUDE_NULL_VALUES,WITHOUT_ARRAY_WRAPPER
)

print @V_json

Query the locked process and kill it

exec dbo.sp_who_lock
--杀死进程
kill 402

Split function

CREATE FUNCTION [dbo].[Split](@separator VARCHAR(64)=',',@string NVARCHAR(max))
  RETURNS @ResultTab TABLE (
     Id    INT ,
     Res     NVARCHAR(500) 
 )
 AS
 BEGIN
     DECLARE @Num INT
     
     IF(@string IS NOT NULL AND @string <> '' AND LEN(@string)>0)
     BEGIN
         IF(CHARINDEX(@separator,@string)>0)        --判断要截取的字符是否存在
         BEGIN
             SET @Num=0
             WHILE (CHARINDEX(@separator,@string)>0)        --如果要截取的字符存在,就继续循环
             BEGIN
                 SET @Num=@Num+1
                 
                 INSERT INTO @ResultTab(Id,Res)        --截取字符串,插入表变量
                 SELECT @Num,LEFT(@string,CHARINDEX(@separator,@string)-1)
                 
                 --把已经截取并插入的字符串删除
                 SET @string=STUFF(@string,1,CHARINDEX(@separator,@string)-1+LEN(@separator),'')    
             END
             
             --如果最后一个截取的字符串为空,那就不插入了
             --例如:'0123,0456,0789,' 这样的字符串最后剩下的就是空字符串了
             IF(@string IS NOT NULL AND @string <> '')
             BEGIN
                 INSERT INTO @ResultTab(Id,Res)
                 SELECT @Num+1,@string 
            END            
         END
         ELSE
         BEGIN
             INSERT INTO @ResultTab(Id,Res) SELECT 1,@string 
         END
     END
     ELSE
     BEGIN
         DELETE FROM @ResultTab
     END
     RETURN
 END

Guess you like

Origin blog.csdn.net/qq243348167/article/details/124763720