2013-04-04 328 views
1

我有这个存储过程SQL Server存储过程sp_executesql

USE [all_things] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[sp_getThingsByType] 
    @thingid int, 
    @typeid int 
AS 

DECLARE @Sql NVARCHAR(MAX) = 'SELECT * from items' 

IF @thingid IS NOT NULL 
BEGIN 
    SET @Sql += ' where thingid = @thingid' 
END 

IF @typeid IS NOT NULL 
BEGIN 
    SET @Sql += ' and TypeID = @typeid' 
END 

EXEC sp_executesql @sql, N'@thingid int,@typeid int',@[email protected],@[email protected]; 

测试用例:

  1. 当我运行它thingidnulltypeidnull,我得到的所有结果是完善。

  2. thingid供应和typeidnull,结果是OK

  3. 这里是哪里,结果并不好:thingidnulltypeid供应。一切都被退回。

我错过了什么?

谢谢

+1

imho,如果thingid为空而不是typeid,则表示有一个格式不正确的查询,它们看起来像是select * from items和TypeID = @ typeid'。 – tschmit007 2013-04-04 15:31:28

+0

我没有看到。谢谢 – mpora 2013-04-04 15:34:29

回答

1

感谢@ tschmit007,我修好了。

USE [all_things] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[sp_getThingsByType] 
    @thingid int, 
    @typeid int 
AS 

DECLARE @Sql NVARCHAR(MAX) = 'SELECT * from items' 

IF @thingid IS NOT NULL 
BEGIN 
    SET @Sql += ' where thingid = @thingid' 
END 

IF @typeid IS NOT NULL AND @thingid IS NOT NULL 
BEGIN 
    SET @Sql += ' and TypeID = @typeid' 
END 

IF @typeid IS NOT NULL AND @thingid IS NULL 
BEGIN 
    SET @Sql += ' where TypeID = @typeid' 
END 

EXEC sp_executesql @sql, N'@thingid int,@typeid int',@[email protected],@[email protected];