【SQL Server】3.sql server 基本语句块

目录:
    1、sql server多行数据(一列)转换成一个字段
    2、Sql Server异常捕获 try catch
    3、备份数据库
    4、清理日志
    5、SQL Server 删除数据库所有表和所有存储过程
    6、sql server 数据库创建链接服务器访问另外一个sql server 数据库
    7、 SQL Server中使用convert进行日期转换
    8、查询

1、sql server多行数据(一列)转换成一个字段

--sql server多行数据(一列)转换成一个字段

CREATE TABLE #test
(
id  INT NOT NULL,
memeo INT NOT NULL
)

INSERT INTO #test(id,memeo) VALUES(1,100)
INSERT INTO #test(id,memeo) VALUES(2,200)
INSERT INTO #test(id,memeo) VALUES(3,300)
 
SELECT STUFF((SELECT ','+CAST(memeo AS NVARCHAR(20)) 
FROM #test FOR XML PATH('')),1,1,'')  --STUFF:删除指定长度的字符,并在指定的起点处插入另一组字符。

DROP TABLE #test


--总结:
--格式:SELECT STUFF((SELECT ','+字段 FROM 表名 FOR XML PATH('')),1,1,'')

2、Sql Server异常捕获 try catch

--Sql Server异常捕获 try catch
declare @num int
begin try
set @num=1/0
end try

begin catch
select ERROR_LINE() as 错误行数, ERROR_MESSAGE() as 错误消息
end catch

3、备份数据库

USE [OwnDB]
GO
/****** Object:  StoredProcedure [dbo].[Pro_DBBackup]    Script Date: 2017/10/30 11:28:30 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--备份数据库    
CREATE PROC [dbo].[Pro_DBBackup]  
    (  
      @dbPath NVARCHAR(200) ,   --备份文件存放路径,最后带/  
      @DbName VARCHAR(50)       --要备份的数据库名称  
    )  
AS   
    SELECT  @dbPath = @dbPath + @DbName + '_' + CONVERT(VARCHAR(20), GETDATE(), 112)  
            + REPLACE(CONVERT(VARCHAR(20), GETDATE(), 108), ':', '') + '.bak'    
    BACKUP DATABASE @DbName     
TO DISK = @dbPath  WITH NOINIT , NOUNLOAD , NOSKIP , STATS = 10, NOFORMAT


--执行存储过程:EXEC [dbo].[Pro_DBBackup] 'D:\dbbak\dbBackup\', 'OwnDB'


4、清理日志

USE [master]
GO
ALTER DATABASE [Database_Name] SET RECOVERY SIMPLE WITH NO_WAIT
GO
ALTER DATABASE [Database_Name] SET RECOVERY SIMPLE --简单模式
GO
--select * from sys.database_files
USE [Database_Name]
GO
DBCC SHRINKFILE (N'Database_Name_log' , 1, TRUNCATEONLY) 
GO
 
USE [master]
GO
ALTER DATABASE [Database_Name] SET RECOVERY FULL WITH NO_WAIT
GO
ALTER DATABASE [Database_Name] SET RECOVERY FULL --还原为完全模式
GO

5、SQL Server 删除数据库所有表和所有存储过程

--一、SQL Server 删除数据库所有表和所有存储过程
--场景:
--SQL Server中,需要删除所有表或所有存储过程时,手动的方式只能逐个进行删除,耗个人时间,所以想弄个语句来实现这样的需求。
--如果由于外键约束删除table失败,则先删除所有约束:
--/第1步**********删除所有表的外键约束*************************/
DECLARE c1 cursor for 
    select 'alter table ['+ object_name(parent_obj) + '] drop constraint ['+name+']; '
    from sysobjects 
    where xtype = 'F'
open c1
declare @c1 varchar(8000)
fetch next from c1 into @c1
while(@@fetch_status=0)
    begin 
        exec(@c1)
        fetch next from c1 into @c1
    end
close c1
deallocate c1
go

--/第2步**********删除所有表*************************/
use [DatabaseName]      --数据库名
declare @tname varchar(8000)
set @tname=''
select @tname=@tname + Name + ',' from sysobjects where xtype='U'
select @tname='drop table ' + left(@tname,len(@tname)-1)
exec(@tname)
go

--删除所有的存储过程同理可得,但不需要走第一步,只需将第2步的代码的where xtype='U' 改成 where xtype='P',drop table 改成 drop Procedure

--sysobjects的xtype代表含义:

--在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在表中占一行。只有在 tempdb 内,每个临时对象才在该表中占一行。 

--列名 数据类型 描述 
--name sysname 对象名。 
--Id int 对象标识号。 
--xtype char(2) 对象类型。可以是下列对象类型中的一种: 
--C = CHECK 约束 
--D = 默认值或 DEFAULT 约束 
--F = FOREIGN KEY 约束 
--L = 日志 
--FN = 标量函数 
--IF = 内嵌表函数 
--P = 存储过程 
--PK = PRIMARY KEY 约束(类型是 K) 
--RF = 复制筛选存储过程 
--S = 系统表 
--TF = 表函数 
--TR = 触发器 
--U = 用户表 
--UQ = UNIQUE 约束(类型是 K) 
--V = 视图 
--X = 扩展存储过程 

--uid smallint 所有者对象的用户 ID。 
--info smallint 保留。仅限内部使用。 
--status int 保留。仅限内部使用。 
--base_schema_ 
--ver int 保留。仅限内部使用。 
--replinfo int 保留。供复制使用。 
--parent_obj int 父对象的对象标识号(例如,对于触发器或约束,该标识号为表 ID)。 
--crdate datetime 对象的创建日期。 
--ftcatid smallint 为全文索引注册的所有用户表的全文目录标识符,对于没有注册的所有用户表则为 0。 
--schema_ver int 版本号,该版本号在每次表的架构更改时都增加。 
--stats_schema_ 
--ver int 保留。仅限内部使用。 
--type char(2) 对象类型。可以是下列值之一: 
--C = CHECK 约束 
--D = 默认值或 DEFAULT 约束 
--F = FOREIGN KEY 约束 
--FN = 标量函数 
--IF = 内嵌表函数 
--K = PRIMARY KEY 或 UNIQUE 约束 
--L = 日志 
--P = 存储过程 
--R = 规则 
--RF = 复制筛选存储过程 
--S = 系统表 
--TF = 表函数 
--TR = 触发器 
--U = 用户表 
--V = 视图 
--X = 扩展存储过程 

--userstat smallint 保留。 
--sysstat smallint 内部状态信息。 
--indexdel smallint 保留。 
--refdate datetime 留作以后使用。 
--version int 留作以后使用。 
--deltrig int 保留。 
--instrig int 保留。 
--updtrig int 保留。 
--seltrig int 保留。 
--category int 用于发布、约束和标识。 
--cache smallint 保留。

--二、统计[Tables]表中的字段个数
--select count(*) from sysobjects a 
--join syscolumns b 
--on a.id=b.id
--where a.name='Tables'
--go


6、sql server 数据库创建链接服务器访问另外一个sql server 数据库

--sql server 数据库创建链接服务器访问另外一个sql server 数据库

EXEC  sp_addlinkedserver
@server='127.0.0.1',   --链接服务器别名
@srvproduct='',
@provider='SQLOLEDB',
@datasrc='127.0.0.1'  --要访问的的数据库所在的服务器的ip
GO
EXEC sp_addlinkedsrvlogin
'127.0.0.1',                  --链接服务器别名
'false', 
 NULL,
'sa',                     --要访问的数据库的用户              
'123456'                    --要访问的数据库,用户的密码

GO

7、 SQL Server中使用convert进行日期转换

SELECT CONVERT(varchar(100), GETDATE(), 0) -- 05 16 2006 10:57AM
SELECT CONVERT(varchar(100), GETDATE(), 1) -- 05/16/06
SELECT CONVERT(varchar(100), GETDATE(), 2) -- 06.05.16
SELECT CONVERT(varchar(100), GETDATE(), 3) -- 16/05/06
SELECT CONVERT(varchar(100), GETDATE(), 4) -- 16.05.06
SELECT CONVERT(varchar(100), GETDATE(), 5) -- 16-05-06
SELECT CONVERT(varchar(100), GETDATE(), 6) -- 16 05 06
SELECT CONVERT(varchar(100), GETDATE(), 7) -- 05 16, 06
SELECT CONVERT(varchar(100), GETDATE(), 8) -- 10:57:46
SELECT CONVERT(varchar(100), GETDATE(), 9) -- 05 16 2006 10:57:46:827AM
SELECT CONVERT(varchar(100), GETDATE(), 10) -- 05-16-06
SELECT CONVERT(varchar(100), GETDATE(), 11) -- 06/05/16
SELECT CONVERT(varchar(100), GETDATE(), 12) -- 060516
SELECT CONVERT(varchar(100), GETDATE(), 13) -- 16 05 2006 10:57:46:937
SELECT CONVERT(varchar(100), GETDATE(), 14) -- 10:57:46:967
SELECT CONVERT(varchar(100), GETDATE(), 20) -- 2006-05-16 10:57:47
SELECT CONVERT(varchar(100), GETDATE(), 21) -- 2006-05-16 10:57:47.157
SELECT CONVERT(varchar(100), GETDATE(), 22) -- 05/16/06 10:57:47 AM
SELECT CONVERT(varchar(100), GETDATE(), 23) -- 2006-05-16 
SELECT CONVERT(varchar(100), GETDATE(), 24) -- 10:57:47
SELECT CONVERT(varchar(100), GETDATE(), 25) -- 2006-05-16 10:57:47.250
SELECT CONVERT(varchar(100), GETDATE(), 100) -- 05 16 2006 10:57AM
SELECT CONVERT(varchar(100), GETDATE(), 101) -- 05/16/2006
SELECT CONVERT(varchar(100), GETDATE(), 102) -- 2006.05.16
SELECT CONVERT(varchar(100), GETDATE(), 103) -- 16/05/2006
SELECT CONVERT(varchar(100), GETDATE(), 104) -- 16.05.2006
SELECT CONVERT(varchar(100), GETDATE(), 105) -- 16-05-2006
SELECT CONVERT(varchar(100), GETDATE(), 106) -- 16 05 2006
SELECT CONVERT(varchar(100), GETDATE(), 107) -- 05 16, 2006
SELECT CONVERT(varchar(100), GETDATE(), 108) -- 10:57:49
SELECT CONVERT(varchar(100), GETDATE(), 109) -- 05 16 2006 10:57:49:437AM
SELECT CONVERT(varchar(100), GETDATE(), 110) -- 05-16-2006
SELECT CONVERT(varchar(100), GETDATE(), 111) -- 2006/05/16 
SELECT CONVERT(varchar(100), GETDATE(), 112) -- 20060516
SELECT CONVERT(varchar(100), GETDATE(), 113) -- 16 05 2006 10:57:49:513
SELECT CONVERT(varchar(100), GETDATE(), 114) -- 10:57:49:547
SELECT CONVERT(varchar(100), GETDATE(), 120) -- 2006-05-16 10:57:49 --常用
SELECT CONVERT(varchar(100), GETDATE(), 121) -- 2006
SELECT CONVERT(varchar(100), GETDATE(), 126) -- 2006-05-16T10:57:49.827
SELECT CONVERT(varchar(100), GETDATE(), 130) -- 18 ???? ?????? 1427 10:57:49:907AM
SELECT CONVERT(varchar(100), GETDATE(), 131) -- 18/04/1427 10:57:49:920AM

8、查询

--查询某一数据库的所有表名
SELECT name FROM SYSOBJECTS WHERE xtype='u'  
--读取指定表的所有列名
SELECT name FROM SYSCOLUMNS WHERE id=(SELECT MAX(id) FROM SYSOBJECTS WHERE xtype='u' AND name='Tb_Name')
--查询视图中所有列名
SELECT name FROM SYSCOLUMNS WHERE id=(SELECT MAX(id) FROM SYSOBJECTS WHERE xtype='v' AND name='View_Tb_Name')  
--sqlserver 获取表的字段名及类型
--方法一
SELECT * FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME='表名' 
--方法二
select a.name tablename, b.name colName, c.name colType ,c.length colLength
from sysobjects a inner join syscolumns b
on a.id=b.id and a.xtype='U'
inner join systypes c
on b.xtype=c.xusertype
where a.name='表名'

猜你喜欢

转载自blog.csdn.net/jiemoxiangcha/article/details/80059162