Sql Server 常用操作

创建、还原数据库

-- 判断是否存在指定数据库
IF EXISTS(SELECT 1 FROM master..sysdatabases WHERE name = 'dbName')
BEGIN
	CREATE DATABASE [dbName]
	ON
	PRIMARY
	(
	  NAME = N'dbName',
	  FILENAME = N'D:\Program Files\ListDBData\dbName.ndf',
	  SIZE = 2304KB,
	  MAXSIZE = UNLIMITED,
	  FILEGROWTH = 1MB
	)
	LOG ON
	(
	  NAME = N'dbName_log',
	  FILENAME = N'D:\Program Files\ListDBData\dbName_log.ldf',
	  SIZE = 768KB,
	  MAXSIZE = UNLIMITED,
	  FILEGROWTH = 10MB
	)
END
GO

-- 还原数据库
RESTORE DATABASE [dbName] 
FROM
  DISK = N'D:\Program Files\dataBackUp\dbName.bak'
WITH
  FILE = 1,
  MOVE N'dbName' TO 'D:\Program Files\ListDBData\dbName.ndf', 
  MOVE N'dbName_log' TO 'D:\Program Files\ListDBData\dbName_log.ldf', 
  REPLACE,
  RECOVERY,
  STATS = 5;
GO

获取本机物理内存大小

SELECT
	CEILING( total_physical_memory_kb * 1.0 / 1024 / 1024 ) AS [Physical Memory Size],
	CAST (
	available_physical_memory_kb * 1.0 / 1024 / 1024 AS DECIMAL ( 8, 4 )) AS [Unused Physical Memory],
	CAST ((
			total_physical_memory_kb - available_physical_memory_kb 
		) * 1.0 / 1024 / 1024 AS DECIMAL ( 8, 4 )) AS [Used Physical Memory],
	CAST (
	system_cache_kb * 1.0 / 1024 / 1024 AS DECIMAL ( 8, 4 )) AS [System Cache Size] 
FROM
	sys.dm_os_sys_memory

修改数据库占用服务大小

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'min server memory', 0;
GO
RECONFIGURE;
GO
sp_configure 'max server memory', 2048;
GO
RECONFIGURE;
GO
sp_configure 'show advanced options', 0;
GO
RECONFIGURE;
GO

通过该方法修改数据库占用内存可不用重启数据库服务

查看数据库及数据表结构

-- 获取所有数据库名:
SELECT name FROM  master..sysdatabases WHERE name NOT IN ( 'master', 'model', 'msdb', 'tempdb', 'northwind','pubs' )

-- 获取某数据库的所有表:
SELECT name FROM dbName..sysobjects Where xtype='U' ORDER BY name
-- 获取所有表名
-- XType='U':表示所有用户表;
-- XType='S':表示所有系统表;

-- 查看数据表的主键
SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME='tableName'

-- 获取表的主键
EXEC sp_pkeys 'tableName'
-- 获取表的外键
EXEC sp_fkeys 'tableName'

-- 查看数据表的字段及属性
SELECT syscolumns.name,systypes.name,syscolumns.isnullable,syscolumns.length FROM syscolumns, systypes WHERE syscolumns.xusertype = systypes.xusertype AND syscolumns.id = object_id('tableName')

查询包含某一字段的所有数据表

select object_id(id) from syscolumns where name = 'columnName' and id in(select id from sysobjects where xtype = 'u')

使用游标循环

BEGIN TRAN a
    declare @Error int = 0;
    -- 定义并声明一个游标
    DECLARE modifyColumns CURSOR FOR
    SELECT object_name( id ) FROM syscolumns WHERE ( name LIKE 'columnName' ) AND id IN ( SELECT id FROM sysobjects WHERE xtype = 'u' ) 
    
    -- 打开游标
    OPEN modifyColumns 
    DECLARE @tableName varchar(64)
    
    -- 开始循环游标变量
    FETCH NEXT FROM modifyColumns INTO @tableName
    
    -- 返回游标状态,为0时结束
    WHILE @@fetch_status = 0
    BEGIN
    	EXEC('
    		EXEC sp_rename ''' + @tableName + '.columnName'', ''columnNameNew'', ''COLUMN''
    	')
    	
    	-- 记录每次执行sql是否正确,0为正确
    	set @Error = @Error + @@ERROR
    	
    	-- 为下一次循环赋值
    	FETCH NEXT FROM modifyColumns INTO @tableName
    END
if @Error = 0
    commit tran a   -- 若正确提交事务
else
    rollback tran a -- 若有误则回滚事务

-- 关闭游标
CLOSE modifyColumns
-- 释放游标
DEALLOCATE modifyColumns

查看数据表索引

SELECT CASE
           WHEN t.[type] = 'U' THEN
               '表'
           WHEN t.[type] = 'V' THEN
               '视图'
       END AS '类型',
       SCHEMA_NAME(t.schema_id) + '.' + t.[name] AS '(表/视图)名称',
       i.[name] AS 索引名称,
       SUBSTRING(column_names, 1, LEN(column_names) - 1) AS '列名',
       CASE
           WHEN i.[type] = 1 THEN
               '聚集索引'
           WHEN i.[type] = 2 THEN
               '非聚集索引'
           WHEN i.[type] = 3 THEN
               'XML索引'
           WHEN i.[type] = 4 THEN
               '空间索引'
           WHEN i.[type] = 5 THEN
               '聚簇列存储索引'
           WHEN i.[type] = 6 THEN
               '非聚集列存储索引'
           WHEN i.[type] = 7 THEN
               '非聚集哈希索引'
       END AS '索引类型',
       CASE
           WHEN i.is_unique = 1 THEN
               '唯一'
           ELSE
               '不唯一'
       END AS '索引是否唯一'
FROM sys.objects t
    INNER JOIN sys.indexes i
        ON t.object_id = i.object_id
    CROSS APPLY
(
    SELECT col.[name] + ', '
    FROM sys.index_columns ic
        INNER JOIN sys.columns col
            ON ic.object_id = col.object_id
               AND ic.column_id = col.column_id
    WHERE ic.object_id = t.object_id
          AND ic.index_id = i.index_id
    ORDER BY col.column_id
    FOR XML PATH('')
) D(column_names)
WHERE t.is_ms_shipped <> 1
      AND index_id > 0
ORDER BY t.[name];

数据库报错

报错信息:

[SQL Server]SQL Server 检测到基于一致性的逻辑 I/O 错误 校验和不正确(应为: 0x140e2a6f,但实际为: 0x164d3c00)。在文件 ‘xxxxxxxxxxxxx.MDF’ 中、偏移量为 0x000002ec20a000 的位置对数据库 ID 15 中的页 (1:1532165) 执行 读取 期间,发生了该错误。SQL Server 错误日志或系统事件日志中的其他消息可能提供了更详细信息。这是一个威胁数据库完整性的严重错误条件,必须立即纠正。请执行完整的数据库一致性检查(DBCC CHECKDB)。此错误可以由许多因素导致;有关详细信息,请参阅 SQL Server 联机丛书。 (824)

处理脚本

use master
go
ALTER DATABASE dbname SET SINGLE_USER
go
DBCC CHECKDB ('dbname', repair_allow_data_loss) with NO_INFOMSGS
go
ALTER DATABASE dbname SET MULTI_USER
go

在恢复文件过程中可能会丢失一些数据,如果执行长时间无反应可重启数据库再尝试,也有可能跟数据库文件过大有关,可以清理数据再做尝试。

数据库可疑

ALTER DATABASE dbName SET EMERGENCY

ALTER DATABASE dbName SET SINGLE_USER

/**
    修复数据库日志重新生成,此命令检查的分配,结构,逻辑完整性和所有数据库中的对象错误。当您指定“REPAIR_ALLOW_DATA_LOSS”作为DBCC CHECKDB命令参数,该程序将检查和修复报告的错误。但是,这些修复可能会导致一些数据丢失
*/
DBCC CheckDB (dbName, REPAIR_ALLOW_DATA_LOSS)

ALTER DATABASE dbName SET MULTI_USER

Transact-SQL创建连接服务器

  1. 调用存储过程sp_addlinkedserver sp_addlinkedlogin创建连接服务器
  • sp_addlinkedserver
sp_addlinkedserver 
    [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]   
    [ , [ @provider= ] 'provider_name' ]  
    [ , [ @datasrc= ] 'data_source' ]   
    [ , [ @location= ] 'location' ]   
    [ , [ @provstr= ] 'provider_string' ]   
    [ , [ @catalog= ] 'catalog' ] 

使用sp_addlinkedserver创建链接服务器后,可对该服务器运行分布式查询。 如果链接服务器定义为 SQL Server实例,则可执行远程存储过程。

[@server =] = ‘server’ 要创建的连接服务器的名称

[@srvproduct= ] ‘product_name’
要添加为链接服务器的 OLE DB 数据源的产品名称。 product_name 的数据类型为 nvarchar(128),默认值为 NULL。

[ @provider= ] ‘provider_name’
与此数据源对应的 OLE DB 访问接口的唯一编程标识符 (PROGID)。 对于当前计算机上安装的指定 OLE DB 提供程序, provider_name必须是唯一的。 provider_name为nvarchar (128),默认值为 NULL;

[ @datasrc = ]* ‘data_source’ *
由 OLE DB 访问接口解释的数据源的名称。 data_source为nvarchar ( 4000 )。 data_source作为 DBPROP_INIT_DATASOURCE 属性传递以初始化 OLE DB 提供程序。

[ @location = ]* ‘位置’ *
由 OLE DB 访问接口解释的数据库的位置。 location的值为nvarchar ( 4000 ),默认值为 NULL。 location作为 DBPROP_INIT_LOCATION 属性传递以初始化 OLE DB 提供程序。

[ @provstr = ]* ‘provider_string’ *
OLE DB 访问接口特定的连接字符串,它可标识唯一的数据源。 provider_string为nvarchar ( 4000 ),默认值为 NULL。 provstr传递给 IDataInitialize,或设置为 DBPROP_INIT_PROVIDERSTRING 属性以初始化 OLE DB 提供程序。

  • sp_addlinkedsrvlogin
sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname'   
    [ , [ @useself = ] { 'TRUE' | 'FALSE' | NULL } ]   
    [ , [ @locallogin = ] 'locallogin' ]   
    [ , [ @rmtuser = ] 'rmtuser' ]   
    [ , [ @rmtpassword = ] 'rmtpassword' ]

[ @rmtsrvname = ] ‘rmtsrvname’
应用登录映射的链接服务器的名称。 rmtsrvname的值为sysname,无默认值。

[ @useself = ] { ‘TRUE’ | ‘FALSE’ | NULL }’
确定是通过模拟本地登录名连接到rmtsrvname ,还是显式提交登录名和密码。 数据类型为varchar ( 8 ),默认值为 TRUE。
如果值为 TRUE,则指定登录名使用其自己的凭据连接到rmtsrvname,并忽略rmtuser和rmtpassword参数。 FALSE 指定rmtuser和rmtpassword参数用于连接到指定locallogin的rmtsrvname 。 如果将rmtuser和RMTPASSWORD设置为 NULL,则不会使用登录名或密码连接到链接服务器。

[ @locallogin = ] ‘locallogin’
本地服务器上的登录。 locallogin的值为sysname,默认值为 NULL。 NULL 指定此条目适用于连接到rmtsrvname的所有本地登录名。 如果不为 NULL,则locallogin可以SQL Server为登录名或 Windows 登录名。 对于 Windows 登录来说,必须以直接的方式或通过已被授权访问的 Windows 组成员身份授予其访问 SQL Server 的权限。

[ @rmtuser = ] ‘rmtuser’
当为 FALSE 时@useself ,用于连接到rmtsrvname的远程登录名。 当远程服务器是不使用 Windows 身份SQL Server验证的实例时, rmtuser是一个SQL Server登录名。 rmtuser的值为sysname,默认值为 NULL。

[ @rmtpassword = ] ‘rmtpassword’
与rmtuser关联的密码。 rmtpassword的值为sysname,默认值为 NULL。

例:

-- 创建连接服务器
exec sp_addlinkedserver 'LINK_SQL', '', 'SQLOLEDB', '127.0.0.1,2433'
exec sp_addlinkedsrvlogin 'LINK_SQL', 'FALSE', NULL, 'sa', '123456'

-- 通过连接服务器查询
select * from [LINK_SQL].[dbName].[dbo].[tableName]

-- 删除连接服务器
exec sp_dropserver 'LINK_SQL', 'DROPLOGINS'

查询数据库所占空间大小

SELECT DB_NAME(database_id) AS [Database Name],[Name] AS [LogicalName],[Physical_Name] AS[Physical Name],((size *8) / 1024) AS [Size(MB)],[differential_base_time] AS[Differential Base Time]
FROM sys.master_files
WHERE DB_NAME(database_id) IN('dbName')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值