SQL Server:不适用于参数的查询

时间:2017-11-13 17:48:37

标签: sql-server tsql

我不确定为什么这个查询以一种方式工作而不是另一种方式。

如果我使用以下查询:

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

它会返回一个结果。

enter image description here

如果我使用完全相同的查询但使用参数:

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

查询不返回任何结果。

enter image description here

之前我曾经多次使用过这种类型的参数查询,但由于某种原因,这次它不起作用。任何人都可以告诉我我错过或搞砸了什么愚蠢的事情?我似乎无法看到任何错误。

1 个答案:

答案 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.