分类 SQL 下的文章

SQL Server迁移数据库文件(ldf&mdf文件)到其他盘

SQL Server安装时,默认都安装在C盘,包括数据库文件的默认位置也是C盘,一般路径是C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA

这就有2个问题:
1,随着时间的推移,数据库文件会增多增大,会逐渐占据C盘空间。不过现在的云服务器都能给系统盘C盘扩容,如果不是云服务器呢?扩容还是有很大的风险的。
2,如果系统盘C盘出问题怎么办?被格式化了,被病毒感染了怎么办?维护服务器,首要考虑就是系统被干了,但数据还健在。



阅读剩余部分

SQL中删除数据DROP、TRUNCATE和DELETE的区别

一,DROP TABLE tablename
删除内容和定义,释放空间。就是把整个表删除掉,表里的数据以及表结构一起删掉。

二,TRUNCATE TABLE tablename
删除内容、释放空间但不删除定义。
就是把表里所有数据删除,删除后,如果再新增数据,id自增字段又是从“标识种子值”开始,比如从0或者1开始自增。

三,DELETE TABLE tablename
删除内容不删除定义,不释放空间。
DELETETRUNCATE相比,最明显的就是,DELETE删除了数据,再新增数据时,id会按照之前已有的数据自增,会造成
标识列不连续。

TRUNCATEDELETE速度快,且使用的系统和事务日志资源少。如果有ROLLBACK命令,DELETE将被撤销,而TRUNCATE则不会被撤销。

所以,如果要删除整个表,只有DROP可选
如果把整个表里的数据清空,推荐TRUNCATE
如果只是删除表里的有些数据,只有DELETE可选

SQL Server查询数据库中包含某个值的表和字段

网上搜索了下,几乎都是先创建一个存储过程:

CREATE PROCEDURE [dbo].[SP_FindValueInDB]
(
    @value VARCHAR(1024)
) 
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @sql VARCHAR(1024) 
    DECLARE @table VARCHAR(64) 
    DECLARE @column VARCHAR(64) 
    CREATE TABLE #t ( 
        tablename VARCHAR(64), 
        columnname VARCHAR(64) 
    ) 
    DECLARE TABLES CURSOR FOR 
    SELECT o.name, c.name FROM syscolumns c 
    INNER JOIN sysobjects o ON c.id = o.id 
    WHERE o.type = 'U' AND c.xtype IN (167, 175, 231, 239) 
    ORDER BY o.name, c.name 
    OPEN TABLES 
        FETCH NEXT FROM TABLES 
        INTO @table, @column 
        WHILE @@FETCH_STATUS = 0 
        BEGIN 
            SET @sql = 'IF EXISTS(SELECT NULL FROM [' + @table + '] ' 
            SET @sql = @sql + 'WHERE RTRIM(LTRIM([' + @column + '])) LIKE ''%' + @value + '%'') ' 
            SET @sql = @sql + 'INSERT INTO #t VALUES (''' + @table + ''', ''' 
            SET @sql = @sql + @column + ''')' 
            EXEC(@sql) 
            FETCH NEXT FROM TABLES 
            INTO @table, @column 
        END 
    CLOSE TABLES 
    DEALLOCATE TABLES 
    SELECT * FROM #t 
    DROP TABLE #t 
End

然后再查询:

EXEC [SP_FindValueInDB] '要查询的值'

在使用过程中要注意一个问题:
1,如果这个库里表很多,那么查询速度就很慢
2,sqlserver表带了很多不同的前缀,比如dbo. defdba. officedba. 用你当前的账号查询到某些前缀的表时,极有可能出现对象名 'XXXtablename' 无效。

SQL语句查询某个数据库中某类表或视图

数据库:Sqlserver
SQL语句:

select * from sysobjects where name like 'Sys%' and (xtype = 'U' or xtype = 'V') order by name

如果筛选的表名称中,包含有下划线_,则用下面语句:

select * from sysobjects where name like 'Sys/_%' ESCAPE '/' and (xtype = 'U' or xtype = 'V') order by name

在Sqlserver的like中下划线类似于通配符%,所以无法使用like '%_%'来匹配下划线,使用转义字符escape。

在语句中,当转义符置于通配符之前时,该通配符就解释为普通字符。上面第二个SQL语句中,‘/’为转义字符,第一、第三个‘%’为通配符。

SQL语句查询某表中所有字段的名称、类型、长度等属性信息

数据库:Sqlserver
SQL语句:

SELECT  
字段名=a.name,
标识=case when COLUMNPROPERTY(a.id,a.name,'IsIdentity')=1 then '√'else '' end,
主键=case when exists(SELECT 1 FROM sysobjects where xtype='PK' and name in (SELECT name FROM sysindexes WHERE indid in(SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid))) then '√' else '' end,
类型=b.name,
占用字节数=a.length,
长度=COLUMNPROPERTY(a.id,a.name,'PRECISION'),
小数位数=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),
允许空=case when a.isnullable=1 then '√'else '' end,
默认值=isnull(e.text,''),
字段说明=isnull(g.[value],'')
FROM syscolumns a
left join systypes b on a.xtype=b.xusertype 
inner join sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties' 
left join syscomments e on a.cdefault=e.id 
left join sys.extended_properties g on a.id=g.major_id and a.colid=g.minor_id 
left join sys.extended_properties f on d.id=f.major_id and f.minor_id =0 
Where d.name='Table_Name'
Order by a.name