SqlServer学习(三)【高级知识】




sqlserver常用sql语句,更改字段,建立唯一键,多个字段去重复等

--修改字段类型:
--alter table 表名 alter column 待修改字段名 待修改字段类型
alter table users alter column userid varchar(10)

--多个字段建立唯一索引
create unique index [索引名] on 表名(字段名,字段名)
alter table 表名 add constraint 约束名 unique (字段名)
alter table 表名 add constraint 约束名 unique (字段名,字段名)

--创建表的时候创建自增主键
create table tb(id int identity(1,1) primary key ) 

--修改字段主键  自增进入ssms界面设置
alter table tb alter column id int not null 
alter table tb add constraint pkid primary key (id)

--修改字段为非空
alter table tb alter column id int not null 

--建立索引
create index mycolumn_index on mytable (myclumn) 
--AmazonOrderId和seller_id两个字段重复
SELECT count(*) 
FROM (
         SELECT rn = ROW_NUMBER()OVER(PARTITION BY AmazonOrderId, seller_id ORDER BY GETDATE()), * 
         FROM Orders
     ) t
WHERE rn = 1

查询数据库表记录数的最快方法

在查询一张表的记录数时,由于记录数太多,采用"Select count(1) from 表名"进行查询一直超时。

后采用下面的SQL,不到1秒钟即返回结果。

select rowcnt from sysindexes where id=object_id('表名')
--------------------------------------------------------------
## SQLServer通过sql修改表主键
先查询出主键的内码,然后删除该主键

```sql
DECLARE @NAME SYSNAME
DECLARE @TB_NAME SYSNAME
	SET @TB_NAME = '表名'
	SELECT TOP 1 @NAME = NAME FROM SYS.OBJECTS WITH(NOLOCK)
WHERE TYPE_DESC ='PRIMARY_KEY_CONSTRAINT' AND PARENT_OBJECT_ID = (SELECT OBJECT_ID FROM SYS.OBJECTS WITH(NOLOCK) WHERE NAME = @TB_NAME )
SELECT @NAME
	DECLARE @ALTERSQL NVARCHAR(MAX)
SET @ALTERSQL=N'ALTER TABLE '+@TB_NAME+' DROP CONSTRAINT '+@NAME
	EXEC SP_EXECUTESQL @ALTERSQL;
GO

然后再添加主键

ALTER TABLE 表名 ADD PRIMARY KEY (主键1, 主键2)
GO

SQL Server表的数据量大小查询

然后在网上找了找SQL脚本,看能不能查看下哪个表的数据量那么大。

网上找到的脚本:

CREATE TABLE #Temp (NAME nvarchar(100),ROWS char(20),reserved varchar(18) ,Data varchar(18) ,index_size varchar(18) ,Unused varchar(18) )
GO
INSERT #Temp EXEC SP_MSFOREACHTABLE 'EXEC sp_spaceused "?"'

SELECT * FROM #Temp ORDER BY CONVERT(INT,REPLACE(DATA,'KB','')) DESC

DROP TABLE #Temp

可以查看每个表数据量大小。记录下来。


SQL SERVER如何获取指定数据库中所有存储过程的参数

 SELECT sp.object_id            AS FunctionId,
       sp.NAME                 AS FunctionName,
       Isnull(param.NAME, '')  AS ParamName,
       Isnull(usrt.NAME, '')   AS [DataType],
       Isnull(baset.NAME, '')  AS [SystemType],
       Cast(CASE
              WHEN baset.NAME IS NULL THEN 0
              WHEN baset.NAME IN ( 'nchar', 'nvarchar' )
                   AND param.max_length <> -1 THEN param.max_length / 2
              ELSE param.max_length
            END AS INT)        AS [Length],
       ''                      AS ParamReamrk,
       Isnull(parameter_id, 0) AS SortId
FROM   sys.objects AS sp
       INNER JOIN sys.schemas b
               ON sp.schema_id = b.schema_id
       LEFT OUTER JOIN sys.all_parameters AS param
                    ON param.object_id = sp.object_id
       LEFT OUTER JOIN sys.types AS usrt
                    ON usrt.user_type_id = param.user_type_id
       LEFT OUTER JOIN sys.types AS baset
                    ON ( baset.user_type_id = param.system_type_id
                         AND baset.user_type_id = baset.system_type_id )
                        OR ( ( baset.system_type_id = param.system_type_id )
                             AND ( baset.user_type_id = param.user_type_id )
                             AND ( baset.is_user_defined = 0 )
                             AND ( baset.is_assembly_type = 1 ) )
       LEFT OUTER JOIN sys.extended_properties E
                    ON sp.object_id = E.major_id
WHERE  sp.type IN ( 'FN', 'IF', 'TF', 'P' )
       AND Isnull(sp.is_ms_shipped, 0) = 0
       AND Isnull(E.NAME, '') <> 'microsoft_database_tools_support'
ORDER  BY sp.NAME,
          param.parameter_id ASC  

如图:
在这里插入图片描述


SQL判断某列中是否包含中文字符、英文字符、纯数字

一、包含中文字符

select * from 表名 where 列名 like '%[吖-座]%'

二、包含英文字符

select * from 表名 where 列名 like '%[a-z]%' 

三、包含纯数字

select * from 表名 where 列名 like '%[0-9]%'

解决 SQLSERVER CTE WITH ')' 附近有语法错误。

WITH t AS (
  SELECT NTILE(10) OVER (order by id) AS PageNumber,ID FROM App
)

老是提示

')' 附近有语法错误。

确定是SQLSERVER005,网上有说WITH前面加分号;的,有的说开什么分隔符开关的,

整了半天,WITH语句后面是要跟语句的

WITH t AS (
  SELECT NTILE(10) OVER (order by id) AS PageNumber,ID FROM App
)
SELECT * FROM t

数据库索引的填充因子

举个例子:假定你刚刚用缺省的填充因子新创建了一个索引。当sqlserver创建它时,它把索引放在相邻的物理页面上,因为数据能够顺序的读所以这样会有最优的i/o访问。但当表随着、、增加和改变时,发生了页拆分。当页拆分发生时,sqlserver必须在磁盘的某处分配一个新的页,这些新的页和最初的物理页不是连续的。因此,访问使用的是随机的i/o,而不是有顺序的i/o,这样访问索引页会变得更慢。

那么理想的填充因子是多少呢?它依赖于应用程序对sqlserver表的读和写的比率。首要的原则,按照下面的指导:

低更改的表(读写比率为100:1):100%的填充因子
高更改的表(写超过读):50-70%的填充因子
读写各一半的:80-90%的填充因子

在为应用程序找到最优的填充因子前也不得不进行试验。不要假定一个低的填充因子总比高的好。低的填充因子会减少页拆分,它也增加了sqlserver查询期间读的页数量,从而减少性能。太低的填充因子不仅增加i/o开销,也影响缓存。当数据页从磁盘移到缓存中时,整个页(包括空的空间)都移到缓存中。所以填充因子越低,不得不移到sqlserver缓存中的页面就越多,意味着同时为其他重要数据页驻留的空间就少,从而降低性能。

如果你没有指定填充因子,缺省的填充因子时0,意味着100%的填充因子(索引的叶页100%的填满,但索引的中间页有预留的空间)。

作为监控的一部分,你要决定新建索引或重建索引时的填充因子是多少。事实上,除了只读数据库,所有的情况,缺省值0都是不适合的。相反,你想要一个填充因子保留合适的自由空间,按照上面的讨论来做。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值