Хотите проверить поля для данных быстро - PullRequest
0 голосов
/ 16 июня 2010

У нас есть настройка базы данных, которая состоит из двух частей: статической структуры и динамических дополнений.Для каждой базы данных динамика может быть разной, и иногда у нас нет данных для всех динамических полей.Прямо сейчас, мы проверяем пустоты, просматривая общее количество записей во всей таблице, но мы хотим перейти к более изощренному методу проверки пустот, если возможно.Можно ли быстро проверить несколько сотен полей и посмотреть, какие из них пусты, а какие заполнены?

Ответы [ 4 ]

0 голосов
/ 16 июня 2010

Я думаю, что самое простое решение - использовать функцию CHECKSUM. Сначала вы захотите определить контрольную сумму для пустой строки, а затем сравнить ее с другими строками.

Select Checksum(*)
From Table

Подвох при использовании * заключается в том, что в него будет включен PK Вам, вероятно, придется указать отдельные столбцы, исключая PK, чтобы получить точное чтение. Так что-то вроде:

Select Checksum(Col1, Col2, Col3)
From Table

Функция контрольной суммы.

0 голосов
/ 16 июня 2010

С Поиск во всех столбцах всех таблиц в базе данных определенного значения

сначала создайте эту функцию

CREATE PROCEDURE FindMyData_String
    @DataToFind NVARCHAR(4000),
    @ExactMatch BIT = 0
AS
SET NOCOUNT ON

DECLARE @Temp TABLE(RowId INT IDENTITY(1,1), SchemaName sysname, TableName sysname, ColumnName SysName, DataType VARCHAR(100), DataFound BIT)

    INSERT  INTO @Temp(TableName,SchemaName, ColumnName, DataType)
    SELECT  C.Table_Name,C.TABLE_SCHEMA, C.Column_Name, C.Data_Type
    FROM    Information_Schema.Columns AS C
            INNER Join Information_Schema.Tables AS T
                ON C.Table_Name = T.Table_Name
        AND C.TABLE_SCHEMA = T.TABLE_SCHEMA
    WHERE   Table_Type = 'Base Table'
            And Data_Type In ('ntext','text','nvarchar','nchar','varchar','char')


DECLARE @i INT
DECLARE @MAX INT
DECLARE @TableName sysname
DECLARE @ColumnName sysname
DECLARE @SchemaName sysname
DECLARE @SQL NVARCHAR(4000)
DECLARE @PARAMETERS NVARCHAR(4000)
DECLARE @DataExists BIT
DECLARE @SQLTemplate NVARCHAR(4000)

SELECT  @SQLTemplate = CASE WHEN @ExactMatch = 1
                            THEN 'If Exists(Select *
                                          From   ReplaceTableName
                                          Where  Convert(nVarChar(4000), [ReplaceColumnName])
                                                       = ''' + @DataToFind + '''
                                          )
                                     Set @DataExists = 1
                                 Else
                                     Set @DataExists = 0'
                            ELSE 'If Exists(Select *
                                          From   ReplaceTableName
                                          Where  Convert(nVarChar(4000), [ReplaceColumnName])
                                                       Like ''%' + @DataToFind + '%''
                                          )
                                     Set @DataExists = 1
                                 Else
                                     Set @DataExists = 0'
                            END,
        @PARAMETERS = '@DataExists Bit OUTPUT',
        @i = 1

SELECT @i = 1, @MAX = MAX(RowId)
FROM   @Temp

WHILE @i <= @MAX
    BEGIN
        SELECT  @SQL = REPLACE(REPLACE(@SQLTemplate, 'ReplaceTableName', QUOTENAME(SchemaName) + '.' + QUOTENAME(TableName)), 'ReplaceColumnName', ColumnName)
        FROM    @Temp
        WHERE   RowId = @i


        PRINT @SQL
        EXEC SP_EXECUTESQL @SQL, @PARAMETERS, @DataExists = @DataExists OUTPUT

        IF @DataExists =1
            UPDATE @Temp SET DataFound = 1 WHERE RowId = @i

        SET @i = @i + 1
    END

SELECT  SchemaName,TableName, ColumnName
FROM    @Temp
WHERE   DataFound = 1

Теперь вызывайте ее так для строкс пустыми строками в столбцах любого строкового типа

exec FindMyData_String '',1

это даст вам вывод с именем столбца, именем таблицы и именем схемы. Просто имейте в виду, что он будет искать все таблицы

0 голосов
/ 16 июня 2010

Для поиска любых строк, которые имеют NULLS в любом столбце, вы можете сделать это, сначала создайте этот процесс, который основан на коде здесь Поиск во всех столбцах во всех таблицах в базе данных определенного значения

CREATE PROCEDURE FindMyData_StringNull
    @DataToFind NVARCHAR(4000),
    @ExactMatch BIT = 0
AS
SET NOCOUNT ON

DECLARE @Temp TABLE(RowId INT IDENTITY(1,1), SchemaName sysname, TableName sysname, ColumnName SysName, DataType VARCHAR(100), DataFound BIT)

    INSERT  INTO @Temp(TableName,SchemaName, ColumnName, DataType)
    SELECT  C.Table_Name,C.TABLE_SCHEMA, C.Column_Name, C.Data_Type
    FROM    Information_Schema.Columns AS C
            INNER Join Information_Schema.Tables AS T
                ON C.Table_Name = T.Table_Name
        AND C.TABLE_SCHEMA = T.TABLE_SCHEMA
    WHERE   Table_Type = 'Base Table'



DECLARE @i INT
DECLARE @MAX INT
DECLARE @TableName sysname
DECLARE @ColumnName sysname
DECLARE @SchemaName sysname
DECLARE @SQL NVARCHAR(4000)
DECLARE @PARAMETERS NVARCHAR(4000)
DECLARE @DataExists BIT
DECLARE @SQLTemplate NVARCHAR(4000)

SELECT  @SQLTemplate = 'If Exists(Select *
                                          From   ReplaceTableName
                                          Where  Convert(nVarChar(4000), [ReplaceColumnName])
                                                       IS NULL
                                          )
                                     Set @DataExists = 1
                                 Else
                                     Set @DataExists = 0'
                            ,
        @PARAMETERS = '@DataExists Bit OUTPUT',
        @i = 1

SELECT @i = 1, @MAX = MAX(RowId)
FROM   @Temp

WHILE @i <= @MAX
    BEGIN
        SELECT  @SQL = REPLACE(REPLACE(@SQLTemplate, 'ReplaceTableName', QUOTENAME(SchemaName) + '.' + QUOTENAME(TableName)), 'ReplaceColumnName', ColumnName)
        FROM    @Temp
        WHERE   RowId = @i


        PRINT @SQL
        EXEC SP_EXECUTESQL @SQL, @PARAMETERS, @DataExists = @DataExists OUTPUT

        IF @DataExists =1
            UPDATE @Temp SET DataFound = 1 WHERE RowId = @i

        SET @i = @i + 1
    END

SELECT  SchemaName,TableName, ColumnName
FROM    @Temp
WHERE   DataFound = 1

Назовите это так

FindMyData_StringNull NULL,1
0 голосов
/ 16 июня 2010

Предполагая, что вы просто проверяете, есть ли в столбце значения, отличные от NULL, использование EXISTS обычно должно выполняться быстрее, чем получение COUNT (*).COUNT необходимо просканировать всю таблицу, чтобы найти правильный номер.EXISTS просто нужно найти одну строку, которая удовлетворяет условию, прежде чем он перестанет искать.

Если весь столбец равен NULL, тогда время будет примерно одинаковым, но во всех тех случаях, когда у вас есть значения, это может бытьсущественно короче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...