Sql server 比较不同长度的瓦查尔
我正在编写一个存储过程,需要将SQL Server变量与列进行比较。问题是,如果我的SQL变量是与列类型长度不同的VARCHAR,那么它将不匹配 示例: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
比如说,我有一个表
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能给你一个警告,但是哦,好吧。