2013-04-04 4 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. Когда я запускаю его с thingid является null и typeid является null, я получаю все результаты, которые есть идеально.

  2. Когда thingid поставляется и typeid является null, результаты хорошо

  3. Вот где, результаты не очень хорошие: thingid является null и typeid поставляется. Все возвращается.

Что мне не хватает?

Благодаря

+1

imho, если thingid имеет значение null, а не typeid, у вас есть неверный запрос, который ищет 'select * from items и TypeID = @ typeid'. – tschmit007

+0

Я этого не видел. благодаря – mpora

ответ

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]; 
Смежные вопросы