【问题标题】:Find All Empty and Null fields in a database. How to output just the Column Name?在数据库中查找所有空和空字段。如何只输出列名?
【发布时间】:2017-11-10 03:49:07
【问题描述】:

我有一个可以在整个数据库中查找空格和 NULL 值的脚本。从技术上讲,在数据库的模式中。

我从以下链接修改了脚本:Search every table and field in a SQL Server Database Updated

问题是我作为输出得到的最后 2 列是 2 列,其中以下示例作为字段:

第 1 列:表名

 [SCHEMA_NAME].[TABLE_NAME]
 [SCHEMA_NAME].[TABLE_NAME2]
 [SCHEMA_NAME].[TABLE_NAME2]
 [SCHEMA_NAME].[TABLE_NAME3]
 [SCHEMA_NAME].[TABLE_NAME4]
 ...and so on

第 2 列:列名

 [SHCEMA_NAME].[TABLE_NAME].[COLUMN_NAME1]
 [SHCEMA_NAME].[TABLE_NAME2].[COLUMN_NAME1]
 [SHCEMA_NAME].[TABLE_NAME2].[COLUMN_NAME2]
 [SHCEMA_NAME].[TABLE_NAME3].[COLUMN_NAME1]
 [SHCEMA_NAME].[TABLE_NAME4].[COLUMN_NAME1]
 ...and so on

如何从第二列中删除 SCHEMA_NAME 和 TABLE_NAME,所以我只得到 column_name?(因为该信息已经在 TableName 上。

这是我到目前为止提出的代码,可以为您提供我提到的输出。

DECLARE @SearchStr nvarchar(100)
SET @SearchStr =''

    CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))--,TableName varchar(200))

    SET NOCOUNT ON

    DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
    SET  @TableName = ''
    SET @SearchStr2 = QUOTENAME('' + @SearchStr + '','''')

    WHILE @TableName IS NOT NULL

    BEGIN
        SET @ColumnName = ''
        SET @TableName = 
        (
            SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
            FROM     INFORMATION_SCHEMA.TABLES
            WHERE         

                TABLE_SCHEMA = 'SAMPLE SCHEMA HERE'
                AND TABLE_TYPE = 'BASE TABLE'
                AND    QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
                AND    OBJECTPROPERTY(
                        OBJECT_ID(
                            QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                             ), 'IsMSShipped'
                            ) = 0
        )

        WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)

        BEGIN
            SET @ColumnName =
            (
                SELECT MIN(QUOTENAME(COLUMN_NAME))
                FROM     INFORMATION_SCHEMA.COLUMNS
                WHERE         TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                    AND    TABLE_NAME    = PARSENAME(@TableName, 1)
                    AND    DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal')
                    AND    QUOTENAME(COLUMN_NAME) > @ColumnName
            )

            IF @ColumnName IS NOT NULL

            BEGIN
                INSERT INTO #Results
                EXEC
                (
                    'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) FROM ' + @TableName + ' (NOLOCK) ' +
                    ' WHERE ' + @ColumnName + '=' + @SearchStr2 +
                    ' OR' + @ColumnName + ' IS NULL '
                )
            END
        END   
    END

        SELECT  DISTINCT left(columnName, charindex('.', ColumnName, charindex('.',ColumnName )+1)-1) as tableName,ColumnName FROM #Results Order by tableName;


                DROP TABLE #Results

注意:如果要运行代码,请确保在“SAMPLE SCHEMA HERE”行中插入架构或删除该行以搜索整个数据库

【问题讨论】:

  • 您使用的是哪个 DBMS?这看起来很像 sql server。
  • 我会为 SQL Server 使用 PARSENAME。 @SeanLange 从他们发布的链接来看,我认为您是正确的,我删除了 mysql 标签。
  • 这是 SQL 服务器,我的错。网站新手,我想我意外点击了建议的标签。

标签: sql-server database tsql


【解决方案1】:

使用PARSENAME,您可以使用以下 sn-p 更新您的最终 SELECT。

SELECT 
    DISTINCT 
    left(columnName, charindex('.', ColumnName, charindex('.',ColumnName )+1)-1) as tableName,
    parsename(ColumnName,1) as ColumnName
    --quotename(parsename(ColumnName,1)) as ColumnName --if you want the brackets still 
FROM #Results 
Order by tableName;

示例

declare @column varchar(256) = '[schema].[table].[column]'

select parsename(@column,1)
select quotename(parsename(@column,1)) --if you want the brackets still

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    相关资源
    最近更新 更多