SQL - 查找所有UPPER CASE字符串

时间:2015-08-10 17:57:55

标签: sql-server sql-function

有没有办法可以从表中获取列中的所有大写字符串。 就像创建一个函数一样?

是否可以执行区分大小写的查询?特别是,我想找到某个列中大写的所有字符串。这就是我尝试过的:

select *
from MyTable
where 
column1 = upper(column1) collate SQL_Latin1_General_CP1_CS_AS

3 个答案:

答案 0 :(得分:3)

你第一次把它钉了。

SELECT * FROM MyTable WHERE Column1 = UPPER(Column1) COLLATE SQL_Latin1_General_CP1_CS_AS

以上是最简单的,似乎是最快的。它会通过将其放入函数来减速,现在内置函数存在。由于解释原因,其他答案值得他们的优点。

编辑: 第2部分 - 原始提问者进一步询问"如何搜索所有表格&数据库中的列?"。这是一个快速找到的方法。如果你想要返回所有拥有所有大写字母的字段,只需删除" TOP 1"从下面的程序,但要注意。如果你有超过很多记录,你可能会耗尽内存。

CREATE PROCEDURE SP_SearchAllTablesForAFieldWithAllCapitals
AS
BEGIN
    CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))

    SET NOCOUNT ON

    DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128)
    SET  @TableName = ''

    WHILE @TableName IS NOT NULL
    BEGIN
        SET @ColumnName = ''
        SET @TableName = 
        (
            SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
            FROM    INFORMATION_SCHEMA.TABLES
            WHERE       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')
                    AND QUOTENAME(COLUMN_NAME) > @ColumnName
            )

            IF @ColumnName IS NOT NULL
            BEGIN
                INSERT INTO #Results
                EXEC
                (
                    'SELECT TOP 1''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
                    FROM ' + @TableName + ' (NOLOCK) ' +
                    ' WHERE ' + @ColumnName + ' = UPPER(' + @ColumnName + ') COLLATE Latin1_General_CS_AS'
                )
            END
        END 
    END

    SELECT ColumnName, ColumnValue FROM #Results
END
GO
EXEC SP_SearchAllTablesForAFieldWithAllCapitals

仅供参考:我使用此处的查询作为起点。 How to search all text fields in a DB for some substring with T-SQL

答案 1 :(得分:0)

您可以使用HASHBYTES并比较哈希值。

select *
  from MyTable
 where hashbytes('SHA1',upper(column1)) = hashbytes('SHA1',column1)

即使您的数据库不区分大小写,这也会有效。

答案 2 :(得分:-1)

我认为Brian Stork的反应会比我快。如果你想在函数中使用它并且不希望函数使用HASHBYTES那么你就可以做这样的事情......

CREATE FUNCTION F_IsUpper
(
    @S VARCHAR(MAX)
)
RETURNS BIT
AS
BEGIN
    DECLARE @Result AS BIT
    SET @Result = 0

    IF @S = UPPER(@S) COLLATE Latin1_General_CS_AS
    BEGIN
        SET @Result = 1
    END
    RETURN @Result
END
GO
SELECT * FROM MyTable WHERE DBO.F_IsUpper(column1)= 1