debugsqlMinor
OPTIMIZE FOR variable error
Viewed 0 times
errorvariableforoptimize
Problem
I'm having a problem specifying a value within an
The value specified for the variable "@test" in the OPTIMIZE FOR
clause could not be implicitly converted to that variable's type.
The example below is slightly contrived but the problem is the same as the one I'm having with my actual query.
What am I doing wrong?
OPTIMIZE FOR statement. I'd like to optimize the query with the value as a string, but I must be doing something wrong, because SQL gives the following error:The value specified for the variable "@test" in the OPTIMIZE FOR
clause could not be implicitly converted to that variable's type.
The example below is slightly contrived but the problem is the same as the one I'm having with my actual query.
declare @TEMP table(asWord nvarchar(max), asNumber int)
insert into @TEMP (asWord, asNumber) values (
'one',
1
), (
'two',
2
)
DECLARE @test nvarchar(max)
SET @test = 'one'
select * from @TEMP
where asWord = @test
OPTION (OPTIMIZE FOR(@test = 'one'))
What am I doing wrong?
Solution
It is because you are declaring your
From the docs on
You should change the length of the variable to the size of the highest possible character length of the value that will be stored in it.
DB<>Fiddle
In theory you are able to optimize for
When creating 4000 spaces:
And adding them to the end of the constant:
```
declare @TEMP table(asWord nvarchar(max), asNumber int)
insert into @TEMP (asWord, asNumber) values (
'one',
1
), (
'two',
2
)
DECLARE @test nvarchar(max)
SET @test = 'one'
select * from @TEMP
where asWord = @test
OPTION (OPTIMIZE FOR(@test = N'one
@test variable as nvarchar(max) and comparing that to a non lob literal in the OPTIMIZE FOR clause.From the docs on
OPTIMIZE FOR :OPTIMIZE FOR ( _@variable\_name_ { UNKNOWN | = literal_constant } [ , ...n ] )You should change the length of the variable to the size of the highest possible character length of the value that will be stored in it.
DECLARE @test nvarchar(3);DB<>Fiddle
NVARCHAR(MAX) and OPTIMIZE FOR In theory you are able to optimize for
nvarchar(max) fields, but it appears that the literal has to be over 4000 (for nvarchar) characters long:When creating 4000 spaces:
SELECT REPLICATE(' ', 4000);And adding them to the end of the constant:
```
declare @TEMP table(asWord nvarchar(max), asNumber int)
insert into @TEMP (asWord, asNumber) values (
'one',
1
), (
'two',
2
)
DECLARE @test nvarchar(max)
SET @test = 'one'
select * from @TEMP
where asWord = @test
OPTION (OPTIMIZE FOR(@test = N'one
Code Snippets
OPTIMIZE FOR ( _@variable\_name_ { UNKNOWN | = literal_constant } [ , ...n ] )DECLARE @test nvarchar(3);SELECT REPLICATE(' ', 4000);declare @TEMP table(asWord nvarchar(max), asNumber int)
insert into @TEMP (asWord, asNumber) values (
'one',
1
), (
'two',
2
)
DECLARE @test nvarchar(max)
SET @test = 'one'
select * from @TEMP
where asWord = @test
OPTION (OPTIMIZE FOR(@test = N'one declare @TEMP table(asWord nvarchar(max), asNumber int)
insert into @TEMP (asWord, asNumber) values (
'one',
1
), (
'two',
2
)
DECLARE @test nvarchar(3)
SET @test = 'one'
select * from @TEMP
where asWord = @test
OPTION (OPTIMIZE FOR(@test = N'one Context
StackExchange Database Administrators Q#242719, answer score: 6
Revisions (0)
No revisions yet.