SQL server语句集

--查询所有表
SELECT NAME,* FROM SYSOBJECTS WHERE XTYPE='U' order by SYSOBJECTS.name 
--查询所有存储过程
select * from sysobjects where type='P' order by [name]
--查询表约束
exec sp_helpconstraint @objname=book_detail --@objname=prx_class
go
-- 查看内容(存储过程)
sp_helptext 'P_Sys_MenuList'

--查询所有触发器
select name from sysobjects where xtype='TR' 

 --查询所有视图
select name from sysobjects where xtype='V'

--查询触发器与关联表
SELECT tb2.name AS tableName,tb1.name AS triggerName FROM Sysobjects tb1 JOIN Sysobjects tb2 ON tb1.parent_obj=tb2.id WHERE tb1.type='TR'

/**判断是否存在该触发器**/
--if exists (select * from sysobjects where id=object_id(N'Trg_IC_Log_Insert1') and type='tr')
-- or
if (object_id('Trg_IC_Log_Insert1','tr') is not null )
drop TRIGGER [Trg_IC_Log_Insert1] 
go

/*修改表命令*/

--移除主键
alter table tb_name drop constraint PK_name
--添加多列主键
alter table  tb_name  add constraint PK_name primary key(column1,column2,column3) 
--修改表列名或属性 add 增加列,drop 移除列
alter table  tb_name alter column column1 varchar(10) null

--通过某个字段名称找到数据库中对应的表
USE Works 
GO
select DISTINCT object_name(id)
from syscolumns
where name like '%the_class%' order by 1 
GO

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

select * from sysobjects
where object_name(id) in (
'OE_ORDER_LINES_ALL',
'OE_ORDER_HEADERS_ALL',
'OE_TRANSACTION_TYPES_TL',
'FNDLOOKUPVALUES',
'HZ_CUST_SITE_USES_ALL',
'HZ_CUST_ACCT_SITES_ALL')

--sql 按默认顺序排序,生成RowNum列(行号列)
select identity(int,1,1) as sort,* into #temp from tb1
select * from #temp order by sort

select * from 表名 as a where exists (select 1 from 
(select 工单编号,max(处理时间) as 处理时间 from 表名 group by 工单编号) as b where a.工单编号=b.工单编号 and a.处理时间=b.处理时间)

SELECT * FROM
(
select row_number() over(partition by mn order by NotesTime DESC) as number,* from T_TaskNotes 
) as tb where number=1

Use newzs
go
sp_change_users_login 'update_one', 'infos1', 'infos1'

 /*       
其中newzs为存在孤立用户的数据库,update_one是存储过程的参数,表示只处理一个用户,前一个infos1是“用户”,后一个infos1是“登录”,以上这个SQL表示将服务器登录“infos1”与 newzs数据库用户“infos1”重新连接起来。这样就可以正常使用数据库了
*/

/*数据库手动抛出错误异常*/
--内容 级别
RAISERROR ('678 ''数据异常'' 已经结账' , 16, 1) WITH NOWAIT
RAISERROR ('无效用户ID。' , 16, 1)  

/*分词搜索查找*/

declare @a varchar(10) 
declare @s varchar(1000)
declare @t table(name varchar(10))
set @a='a,b,c'
set @s=right(replace(','+@a,',',''' as name union select '''),len(replace(','+@a,',',''' as name union select '''))-15)+''''
insert into @t exec(@s)
select * from tb b where exists
(select 1 from @t a where charindex(a.name,b.name)>0)

if object_id('[tb]') is not null drop table [tb]
create table [tb] (id int,name varchar(25))
insert into [tb]
select 1,'asdf富士康sfsaf' union all
select 2,'富士康sdaf跳楼' union all
select 3,'sdaf跳楼' union all
select 4,'asdf富士康as跳楼郭台铭asf' union all
select 5,'郭台铭asf'
 
 
declare @name varchar(50),@sql varchar(8000)
set @Name='富士康 跳楼 郭台铭'
set @sql=' (case when charindex('''+replace(@name,' ',''',name)>0 then 1 else 0 end)+(case when charindex(''')+''',name)>0 then 1 else 0 end)'
set @sql='select * from tb order by '+@sql+' desc'

/**全文检索(查询整个数据库中某个特定值所在的表和字段的方法 )**/

DECLARE @keyWord VARCHAR(200)
set @keyWord='hy'

-- 最大的长度.
DECLARE @MaxLength INT;
-- 数据库表名称
DECLARE @TableName VARCHAR(100);
-- 数据库表ID
DECLARE @object_id INT;
-- 查询列名的SQL
DECLARE @ColumnSql VARCHAR(500);
-- 列名.
DECLARE @clumnName VARCHAR(20);

-- 查询 数据是否存在的SQL
DECLARE @Sql NVARCHAR(500);

-- 查询 数据是否存在结果
DECLARE @RowCount INT;

BEGIN

-- 取得 传入的 字符串长度
-- 对于 表定义中, 字段长度小于 该长度的,将不检索.
SET @MaxLength = LEN(@keyWord);

-- 定义游标. 取得所有的数据库表名称.
DECLARE c_test_main CURSOR FAST_FORWARD FOR
    SELECT object_id, name FROM sys.tables

-- 打开游标.
OPEN c_test_main;

-- 填充数据.
FETCH NEXT FROM c_test_main INTO @object_id, @TableName;

-- 假如检索到了数据,才处理.
WHILE @@fetch_status = 0
BEGIN

    -- 准备用于执行的 查询列信息的 SQL 语句.
    SET @ColumnSql = 'DECLARE cur_column CURSOR for SELECT col.name '
      + ' FROM sys.columns col, sys.types typ '   -- 从列视图 与 数据类型视图查询
      + ' WHERE '
      + '   col.system_type_id = typ.system_type_id' -- 列视图 与 数据类型视图 关联
      + '   AND typ.name IN(''varchar'', ''nvarchar'', ''char'', ''nchar'') ' -- 只查询指定数据类型的.
      + '   AND col.max_length > ' + LTRIM(STR(@MaxLength )) -- 最大长度要大于 输入信息长度的
      + '   AND col.object_id =' + LTRIM(STR(@object_id)); -- 表ID

    EXEC(@ColumnSql);

    OPEN cur_column;
    FETCH next FROM cur_column INTO @clumnName;
    WHILE @@FETCH_STATUS=0
      BEGIN

        SET @Sql = 'SELECT @RowCount = COUNT(1) FROM ' + @TableName + ' WHERE ' + @clumnName + ' LIKE ''%' + @keyWord + '%'' ';

        EXEC SP_EXECUTESQL @Sql, N'@RowCount INT OUTPUT', @RowCount OUTPUT;
       
        IF @RowCount > 0
        BEGIN
          PRINT @TableName + '.' + @clumnName;
        END

        FETCH next FROM cur_column INTO @clumnName;
      END
    CLOSE cur_column;
    DEALLOCATE cur_column;

    -- 填充下一条数据.
    FETCH NEXT FROM c_test_main INTO @object_id, @TableName;
END;
-- 关闭游标
CLOSE c_test_main;
-- 释放游标.
DEALLOCATE c_test_main;
END

declare @sql nvarchar(max),@search nvarchar(100)
set @search='hy'
set @sql=''
select @sql=@sql+'select top 1 '''+sysobjects.name+''' as [table],'''+syscolumns.name+''' as [columns],'+syscolumns.name+' as [value] from '+sysobjects.name+' where '+syscolumns.name+'='''+@search+''' union all ' from sysobjects inner join syscolumns on sysobjects.id=syscolumns.id where sysobjects.xtype='U' and syscolumns.xtype in (34,35,99,167,175,231,239,241,231)
select @sql=@sql+'select null,null,null'
exec sp_executesql @sql

select convert(varchar(255),'') dsca
into #y
where 1=0

-- delete #y
declare @s varchar(255)
set @s='hy'
DECLARE bbb cursor for
select  TABLE_NAME,column_name  FROM information_schema.columns
    where table_name in (select  table_name from information_schema.tables where TABLE_type='BASE TABLE' and table_name like '%%' )
    and data_type like '%varchar%'


declare @t varchar(255)
declare @f varchar(255)
open bbb
fetch  next from bbb into @t,@f
while @@fetch_status=0
begin

exec( ' if exists (select * from '+@t+' where '+@f+'='+''''+@s+''''+'  )  insert into #y select '+''''+@t+'.'+@f+''''  )


--insert into #t select  '+''''+'select * from  '+@t+' WHERE '+@f+'=@F'+'''

fetch  next from bbb into @t,@f

end
close bbb
deallocate  bbb

select * from #y
drop table #y

 /**全文检索END*/

SET NOCOUNT ON;--存储过程,当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。
declare @date datetime,@date1 datetime,@substoreid varchar(20)
set @date='2014-09-22'
set @date1='2014-09-30'
set @substoreid='9001'
--临时表用法
select tag,code,name,num,money into #mid from (
select 1 as tag,prx_code as code,prx_name as name,sum(isnull(num,0)) as num,sum(isnull(money,0)) as money from tb1
union    
select 2 as tag,receive_minout.pay_class as code,name as name,0 as num,sum(isnull(money,0)) as money from tb2   
 ) A     
select * from #mid order by tag    
drop table #mid

--SQL每组数据只取前几条数据的写法 

select *
  from (select row_number() over(partition by t.type order by date desc) rn,
               t.*
          from 表名 t)
 where rn <= 2;
/*
type要分的类
date 排序
rn 每类要显示几条数据
*/

/*SQL执行中占CPU资源最多的前10条查询 */
    select top 20  
     total_worker_time/execution_count as avg_cpu_cost,plan_handle,  
    execution_count,  
    (select substring(text,statement_start_offset/2+1,  
    (case when statement_end_offset=-1  
    then len(convert(nvarchar(max),text))*2  
    else statement_end_offset  
    end - statement_start_offset)/2)  
    from sys.dm_exec_sql_text(sql_handle)) as query_text  
    from sys.dm_exec_query_stats  
    order by [avg_cpu_cost] desc  


-- 找出工作负荷中运行最频繁的查询  
    select top 10 total_worker_time,plan_handle,execution_count,  
       (select substring(text,statement_start_offset /2 +1,  
           (case when statement_end_offset = -1  
              then len(convert(nvarchar(max),text))*2  
              else statement_end_offset  
            end - statement_start_offset)/2)  
          from sys.dm_exec_sql_text(sql_handle)) as query_text  
       from sys.dm_exec_query_stats  
       order by execution_count desc  

--找到被编译得最多的前10位查询计划  
    select top 10 plan_generation_num,execution_count,  
      (select substring(text,statement_start_offset /2 +1,  
         (case when statement_end_offset = -1  
           then len(convert(nvarchar(max),text))*2  
           else statement_end_offset  
          end - statement_start_offset)/2)  
        from sys.dm_exec_sql_text(sql_handle)) as query_text  
    from sys.dm_exec_query_stats  
    where plan_generation_num>1  
    order by plan_generation_num desc

/*查询缺失索引*/
SELECT 
DatabaseName = DB_NAME(database_id)
,[Number Indexes Missing] = count(*) 
 FROM sys.dm_db_missing_index_details
 GROUP BY DB_NAME(database_id)
 ORDER BY 2 DESC;

SELECT  TOP 10 
          [Total Cost]  = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0) 
          , avg_user_impact
          , TableName = statement
          , [EqualityUsage] = equality_columns 
          , [InequalityUsage] = inequality_columns
          , [Include Cloumns] = included_columns
FROM        sys.dm_db_missing_index_groups g 
INNER JOIN    sys.dm_db_missing_index_group_stats s 
        ON s.group_handle = g.index_group_handle 
 INNER JOIN    sys.dm_db_missing_index_details d 
        ON d.index_handle = g.index_handle
 ORDER BY [Total Cost] DESC;

/*将一列多行数据合并为一行*/
SELECT  DISTINCT [Student]

      ,STUFF(

                        (

                              SELECT ','+[Course]

                              FROM [dbo].[SC]

                              WHERE Student = A.Student

                              FOR XML PATH('')

                        )

                        ,1,1,''

                  )AS Course

  FROM [dbo].[SC] AS A

/*SQL递归查询*/
WITH SearcRiver AS
(
    SELECT RiverID,UpRiverID FROM T_River 
    WHERE RiverID = '1100000000'
    UNION ALL
    SELECT A.RiverID,A.UpRiverID FROM T_River A, SearcRiver B
    WHERE A.UpRiverID=B.RiverID 
)
select * from SearcRiver

--try catch 事物-回滚
begin  try
begin transaction tr

   select * from Car_Brand
   update car_log set [reason]='ceshiceshiceshi' where [modelid]=557;
   select 1/0
   print 'i have executed!'
   select * from AREA
   
   
   print 'executed success';
   commit transaction tr
   
   
end try
begin catch
  print 'executed failed';
  rollback transaction tr
end catch

查询执行命令的错误信息

函数

描述

ERROR_NUMBER()

返回导致运行 CATCH 块的错误消息的错误号。

ERROR_SEVERITY()

返回导致 CATCH 块运行的错误消息的严重级别

ERROR_STATE()

返回导致 CATCH 块运行的错误消息的状态号

ERROR_PROCEDURE()

返回出现错误的存储过程名称

ERROR_LINE()

返回发生错误的行号

ERROR_MESSAGE()

返回导致 CATCH 块运行的错误消息的完整文本

BEGIN CATCH  
  
        IF @@TRANCOUNT > 0  
  
            ROLLBACK TRAN --RollBack in case of Error  
  
        -- you can Raise ERROR with RAISEERROR() Statement including the details of the exception  
  
        RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1)  
  
    END CATCH

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='my_sp_test' AND TYPE='P') BEGIN
    DROP PROCEDURE my_sp_test;
END;
GO
create procedure my_sp_test @i int, @outstr varchar(100) out as
begin try
    declare @j int;
    if @i<10 begin
      set @outstr = 'system exception.';
      set @j = 10/0;  -- 因为被除数为0,所以这里将会抛出一个系统的异常
    end
    else begin
      set @j = @i;
      set @outstr = 'customer exception';
      -- 抛出自定义的异常,在最后的catch块中统一处理异常
      RAISERROR (66666, -- Message id.
           16, -- Severity,
-- State,
           ) ;    
    end;
end try
begin catch 
    if @@ERROR=66666 begin  -- 通过@@ERROR的值来判断是否是自定义的异常
        set @outstr = @outstr  + '---------------- customer exception';
    end;
    return;
end catch;
go

如上代码,raiserror参数说明:

(1). Message id : 异常的唯一标识,且这个值会被赋值给SQLServer的系统变量@@Error。自定义异常的Message Id建议使用50000以后的,因为50000以内的会被系统异常占用。

(2). Severity : 异常的级别。 可输入1—19的数值。1—10之间不会被catch捕获。19以后是非常严重的级别。

(3). State : 如果输入负值或大于255 的值会生成错误,产生错误则会中断数据库的连接

执行命令,不返回影响行数消息

SET ANSI_NULLS ON

如上代码,raiserror参数说明:

   (1). Message id : 异常的唯一标识,且这个值会被赋值给SQLServer的系统变量@@Error。

          自定义异常的Message Id建议使用50000以后的,因为50000以内的会被系统异常占用。

  (2). Severity : 异常的级别。 可输入1—19的数值。1—10之间不会被catch捕获。19以后是非常严重的级别。

   (3). State : 如果输入负值或大于255 的值会生成错误,产生错误则会中断数据库的连接

猜你喜欢

转载自blog.csdn.net/h610443955/article/details/83024435