分类 SQL 下的文章

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

阅读剩余部分

SQL查询数据库中带有某个相同字段的所有表

一,MySQL查询带有某个字段的所有表:

SELECT * FROM information_schema.columns WHERE column_name='字段名';

二,Oracle查询带有某个字段的所有表:

SELECT * FROM user_tab_columns WHERE column_name='字段名';

三,SQLServer查询带有某个字段的所有表:

SELECT * FROM [库名].[dbo].sysobjects WHERE id IN (SELECT id FROM [库名].[dbo].syscolumns WHERE name = '字段名')

注意:库名、字段名替换为对应的内容

阅读剩余部分

SQL批量修改数据库表中的Unix时间戳

我接触的绝大部分PHP的Web项目,在存时间时,都是存的Unix时间戳,字段类型是int(10),显示的东西类似于1108879309这种数字。

批量修改这种Unix时间戳的MYSQL语句是:

UPDATE `table` SET addtime = unix_timestamp(DATE_SUB(from_unixtime(addtime), INTERVAL 1 MONTH)) WHERE 1

解释上面MYSQLSQL语句中涉及到的SQL函数:
1,用FROM_UNIXTIME()函数将Unix时间戳转换成 YYYY-MM-DD H:I 这种常见的格式,语法:FROM_UNIXTIME(unix_timestamp,format)
2,用DATE_SUB()函数从日期中减去指定的时间间隔,语法:DATE_SUB(date,INTERVAL expr type);如果要加上指定的时间间隔,用DATE_ADD(date,INTERVAL expr type)
DATE_SUB()DATE_ADD()函数不能直接操作Unix时间戳,所以用FROM_UNIXTIME()转换了一下
3,把Unix时间戳转换成 YYYY-MM-DD H:I 这种格式后,减去指定的时间间隔后,肯定要再转换成Unix时间戳才能更新到数据库中,用unix_timestamp()函数

阅读剩余部分