首页 > 解决方案 > 如何包含 ToUpper() INSIDE 查询条件?

问题描述

我有这个查询,它应该在表中获得 active=TRUE 的所有结果,但我想确保如果用户让说更改表中的活动值以说“True”或“tRue”,查询将其识别为预期TRUE,通过某种方式一直在查询条件上应用大写

$Table = Query "SELECT * from [dbo].[$cubeTable] WHERE [active] = 'TRUE'.ToUpper()"
write-host $Table += $row.Item("active")

请注意,这就是我所拥有的,但当然,它会引发错误

WHERE [active] = 'TRUE'.ToUpper()"

使用“1”个参数调用“填充”的异常:“无法在 varchar 上调用方法。”

标签: sql-serverpowershell

解决方案


默认排序规则将默认提供您需要的功能(不区分大小写匹配),但是如果您想在排序规则区分大小写的情况下强制进行不敏感匹配,那么您可以使用UPPER函数,但请注意这将导致对您的表进行全面扫描(因此可能会产生一些主要的性能影响)。

要检查您当前的排序规则:

SELECT DATABASEPROPERTYEX('DbName', 'Collation') SQLCollation;

这将为您提供排序规则,例如Latin1_General_CI_AS

这里的CI意思Case Insensitive

如果你有这个,那么你很高兴。如果没有,你可以这样做:

SELECT * from [dbo].[$cubeTable] WHERE UPPER([active]) = 'TRUE'

但这会扫描你的整个桌子。

如果您有能力更改架构,则可以根据需要强制对列进行排序:

CREATE TABLE [#CollationTest]
(
  [MyColumnName] VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS
)  

INSERT INTO [#CollationTest] ([MyColumnName]) VALUES ('Value123')
INSERT INTO [#CollationTest] ([MyColumnName]) VALUES ('value123')


SELECT * FROM [#CollationTest] WHERE [MyColumnName] = 'value123' -- Returns 2 rows

DROP TABLE [#CollationTest]

推荐阅读