有没有办法可以从表中获取列中的所有大写字符串。 就像创建一个函数一样?
是否可以执行区分大小写的查询?特别是,我想找到某个列中大写的所有字符串。这就是我尝试过的:
select *
from MyTable
where
column1 = upper(column1) collate SQL_Latin1_General_CP1_CS_AS
答案 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