我不确定为什么这个查询以一种方式工作而不是另一种方式。
如果我使用以下查询:
Select
dlb.referenceid, dlb.partnum,
pd.width, pd.length,
dlb.partqty,
Convert(date, dlb.entrydatetime, 101) as entrydatetime,
dlb.status, dlb.material
From
tbl_dlbase dlb
Join
tbl_partdetails pd On dlb.referenceid = pd.referenceid
Where
(pd.Spacing = 3)
And ((dlb.status = 'Available') or (dlb.status = 'Reserved'))
Order By
dlb.status
它会返回一个结果。
如果我使用完全相同的查询但使用参数:
Select
dlb.referenceid, dlb.partnum,
pd.width, pd.length,
dlb.partqty,
Convert(date, dlb.entrydatetime, 101) as entrydatetime,
dlb.status, dlb.material
From
tbl_dlbase dlb
Join
tbl_partdetails pd On dlb.referenceid = pd.referenceid
Where
(@parameter1 = @Criteria1)
And ((dlb.status = 'Available') or (dlb.status = 'Reserved'))
Order By
dlb.status
并声明以下参数并设置如下:
Declare @parameter1 varchar(50)
Declare @Criteria1 varchar(50)
Set @parameter1 = 'pd.Spacing'
Set @Criteria1 = 3
查询不返回任何结果。
之前我曾经多次使用过这种类型的参数查询,但由于某种原因,这次它不起作用。任何人都可以告诉我我错过或搞砸了什么愚蠢的事情?我似乎无法看到任何错误。
答案 0 :(得分:1)
如果没有动态sql,则不能将参数用作对象名称。这是一个修复...当你对它感到满意时,只需将打印更改为exec(@sql)
......
Declare @parameter1 varchar(50)
Declare @Criteria1 varchar(50)
Set @parameter1 = 'pd.Spacing'
Set @Criteria1 = '3'
declare @sql varchar(max)
set @sql =
'Select
dlb.referenceid,
dlb.partnum,
pd.width,
pd.length,
dlb.partqty,
Convert(date, dlb.entrydatetime, 101) as entrydatetime,
dlb.status,
dlb.material
From tbl_dlbase dlb
Join tbl_partdetails pd On
dlb.referenceid = pd.referenceid
Where (' + @parameter1 + ' = ' + @Criteria1 + ')
AND ((dlb.status = ''Available'') OR (dlb.status = ''Reserved''))
Order By dlb.status'
print @sql
--exec(@sql)
--sp_executesql @sql
这使得你的where子句Where (pd.Spacing = 3)
,否则where子句只是比较参数,这些参数显然不相同,因为它们没有设置为相同的东西。这和写作一样:
Select 'True'
where @parameter1 = @Criteria1
被解释为
Select 'True'
where 'pd.Spacing'= '3' --string literals, not column names.