【问题标题】:SQL - Find all UPPER CASE strings [duplicate]SQL - 查找所有大写字符串[重复]
【发布时间】:2015-08-10 17:57:55
【问题描述】:

有没有一种方法可以从表中获取列中的所有大写字符串。 比如创建一个函数?

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

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

【问题讨论】:

  • 我认为您示例中的方法应该可行。您是否尝试过,如果尝试过,是否无效?

标签: sql-server sql-function


【解决方案1】:

你第一次就成功了。

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

【讨论】:

  • 嗨 Jason,有没有办法可以查询整个数据库,并让它返回带有大写字符串的表名和列名?
  • 你能解释更多你想要做什么吗?您是否要搜索所有字段?还是您要搜索列名?
【解决方案2】:

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

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

即使您的数据库不区分大小写,这也可以工作。

【讨论】:

  • 是的,它会起作用......但它的效率非常低。这会强制引擎对每一行执行此函数两​​次。
【解决方案3】:

我认为 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

【讨论】:

  • 我不认为这是一种有效的做事方式。我把它放在那里是为了教育目的。您在上面的 Main SQL 语句中使用它的方式可能是正确的。请不要投反对票,因为它会对试图帮助声誉的人产生负面影响。而是发布您自己的答案,它将获得投票。
  • 我没有投反对票,但提升一个人对无用答案的声誉并不是重点。否决票意味着答案没有用。虽然我不一定认为这没有用,但如果您已经声明您认为它不是很好,我质疑为什么要发布它。从效率的角度来看,另一个答案本身就是一个糟糕的答案,并且增加了很多复杂性而没有任何好处。执行此操作的最佳方法是通过 OP 发布的查询。
  • @SeanLange 我们同意不会因无益的问题而提升自己的声誉。然而,以 0 声望对答案投反对票会稍微伤害那些试图认真回答的人。此外,0 票的答案仍然具有教育价值或有助于向新读者解释整个问题。
  • 可悲的是,这不是那么有效。它是基于功绩而不是意图。这个论坛不是一个学习的地方。对于更具建设性的 sql server 论坛类型,您可以查看sqlservercentral.com 支持和鼓励学习心态。在这里更多的是关于答案和指导。
猜你喜欢
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多