SQL - 查找所有大写字符串
SQL - Find all UPPER CASE strings
有没有办法从 table 中获取列中的所有大写字符串。
喜欢创建函数吗?
是否可以执行区分大小写的查询?特别是,我想找到特定列中所有大写的字符串。这是我试过的:
select *
from MyTable
where
column1 = upper(column1) collate SQL_Latin1_General_CP1_CS_AS
您可以使用 HASHBYTES 并比较哈希值。
select *
from MyTable
where hashbytes('SHA1',upper(column1)) = hashbytes('SHA1',column1)
即使您的数据库不区分大小写,这也能正常工作。
我认为 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
你第一次就搞定了。
SELECT * FROM MyTable WHERE Column1 = UPPER(Column1) COLLATE SQL_Latin1_General_CP1_CS_AS
以上是最简单的,看起来也是最快的。将它放入函数中会减慢速度,现在存在内置函数。出于解释原因,其他答案是值得的。
编辑:
第 2 部分 - 原提问者进一步提问 "How do I search all tables & columns in the database?"。这是一个快速查找的方法。如果你想 return 所有大写的字段只需从下面的过程中删除 "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
有没有办法从 table 中获取列中的所有大写字符串。 喜欢创建函数吗?
是否可以执行区分大小写的查询?特别是,我想找到特定列中所有大写的字符串。这是我试过的:
select *
from MyTable
where
column1 = upper(column1) collate SQL_Latin1_General_CP1_CS_AS
您可以使用 HASHBYTES 并比较哈希值。
select *
from MyTable
where hashbytes('SHA1',upper(column1)) = hashbytes('SHA1',column1)
即使您的数据库不区分大小写,这也能正常工作。
我认为 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
你第一次就搞定了。
SELECT * FROM MyTable WHERE Column1 = UPPER(Column1) COLLATE SQL_Latin1_General_CP1_CS_AS
以上是最简单的,看起来也是最快的。将它放入函数中会减慢速度,现在存在内置函数。出于解释原因,其他答案是值得的。
编辑: 第 2 部分 - 原提问者进一步提问 "How do I search all tables & columns in the database?"。这是一个快速查找的方法。如果你想 return 所有大写的字段只需从下面的过程中删除 "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