Sql server 比较不同长度的瓦查尔

Sql server 比较不同长度的瓦查尔,sql-server,Sql Server,我正在编写一个存储过程,需要将SQL Server变量与列进行比较。问题是,如果我的SQL变量是与列类型长度不同的VARCHAR,那么它将不匹配 示例: 比如说,我有一个表types,其中有一列name,该列的类型为VARCHAR(100)。运行下面的代码不会给我任何结果: DECLARE @type VARCHAR(20); SET @type = 'My Type Name'; select * from types where name = @type 但是,运行此查询将找到我的列: D

我正在编写一个存储过程,需要将SQL Server变量与列进行比较。问题是,如果我的SQL变量是与列类型长度不同的VARCHAR,那么它将不匹配

示例:
比如说,我有一个表
types
,其中有一列
name
,该列的类型为
VARCHAR(100)
。运行下面的代码不会给我任何结果:

DECLARE @type VARCHAR(20);
SET @type = 'My Type Name';
select * from types where name = @type
但是,运行此查询将找到我的列:

DECLARE @type VARCHAR(100);
SET @type = 'My Type Name';
select * from types where name = @type
现在,我希望能够以第一种方式完成,特别是因为如果我修改列,我不希望这个查询开始失败。谁能告诉我我做错了什么

编辑:

以下是我的列模式:

查询:

DECLARE @event_type VARCHAR(20);
SET @event_type = 'Price Increase Notification';
select * from events.types where name = @event_type
DECLARE @event_type VARCHAR(100);
SET @event_type = 'Price Increase Notification';
select * from events.types where name = @event_type
输出:

查询:

DECLARE @event_type VARCHAR(20);
SET @event_type = 'Price Increase Notification';
select * from events.types where name = @event_type
DECLARE @event_type VARCHAR(100);
SET @event_type = 'Price Increase Notification';
select * from events.types where name = @event_type
输出:


以下操作将按照您的描述进行:

CREATE TABLE #types
(
    type VARCHAR(100)
)

INSERT INTO #types (type) VALUES ('My Type Name')

-- returns 1 row
select * from #types

-- returns 0 rows
DECLARE @type VARCHAR(10);
SET @type = 'My Type Name';
select * from #types where type = @type

-- returns 1 row
DECLARE @long_type VARCHAR(100);
SET @long_type= 'My Type Name';
select * from #types where type = @long_type

drop table #types
关键是
声明@type VARCHAR(10);SET@type='My type Name'
实际上会将变量设置为
'My Type Na'
(长度=10)

因此,如果您的值比变量长,则该变量将设置为截断值。没有警告,就没有错误。如果你试着将它等同于原始(更长)值,你会发现它们不相等。

下面是我要做的 选择*from events.types,其中ltrim(rtrim(name))=@event\u type

您编辑的示例:

DECLARE @event_type VARCHAR(20);
SET @event_type = 'Price Increase Notification';
select * from events.types where name = @event_type
您将@event_type设置为的字符串为27个字符,因此它将被截断为20个字符,因此不存在匹配项


如果列长度发生变化,我可能会做些什么来确保您可以将@event\u type声明为varchar(max)

您能在发现这种情况的地方共享一些示例数据吗<代码>'My Type Name'在长度为20的字符串中等于
'My Type Name'
在长度为100的字符串中。如果试图将长度为20的变量设置为长度更大的值,则该变量会被截断,并且可能会得到意外的结果。当输入
“我的类型名称”
超过20个字符时,第一个变量将失败。它会将输入截断为20个字符,并根据
名称
进行验证。它不会抛出任何异常或警告,也不会用示例更新问题。@snyderxc显然
“涨价通知”
的长度大于
20
,因此在第一次查询中
@event\u type
只包含前20个字符
“涨价不如果”
,因此您不会得到预期的结果我忽略了这一点;)谢谢这正是问题所在。我使用了一个超过20个字符的字符串,它被截断了。谢谢!我也真的希望SQL Server能给你一个警告,但是哦,好吧。