stop using dynamic sql

Hi,
The following stored procedure (SP) is using a dynamic sql to build the query.
How can this be written using a standard sql. i.e. NOT dynamically being built.
Initially I thought I can have something like the following query but it does not seem to be working for when the where caluse parameters are not passed.
So I ended up using the dynamic sql as it returns the correct data.
Can you see how the SP can be altered please
Thanks

------------------------this query does not return the correct data where the where parameters are not passed.------------
select
*
from
tbl_Management
where

([Year] is null or [Year] = @Year)
AND
(YearPeriod is null or YearPeriod = @YearPeriod)
AND
(AreaCode is null or AreaCode = @AreaCode)

---------------------------------------------------------------


create procedure usp_PatientManagementAdminGet

@Year int = null,
@YearPeriod int = null,
@AreaCode varchar(3) = null

as

declare @sql varchar(1000)

set @sql = 'select'
set @sql = @sql + ' ID'
set @sql = @sql + ' ,AreaCode'
set @sql = @sql + ' ,Year'
set @sql = @sql + ' ,YearPeriod'
set @sql = @sql + ' ,A1=A2+A3'
set @sql = @sql + ' ,A2,A3'
set @sql = @sql + ' ,B1=B2+B3'
set @sql = @sql + ' ,X1=convert(int, ((B2+B3)*1.0/(A2+A3))*100)'
set @sql = @sql + ' from'
set @sql = @sql + ' tbl_Management'
set @sql = @sql + ' where'

if (@Year > 0)
begin
set @sql = @sql + ' [Year] = ' + convert(varchar(4), @Year)
set @sql = @sql + ' AND'
end
if (@YearPeriod > 0)
begin
set @sql = @sql + ' YearPeriod = ' + convert(varchar(2), @YearPeriod)
set @sql = @sql + ' AND'
end
if (@ProgrammeAreaCode is not null)
begin
set @sql = @sql + ' AreaCode = ''' + convert(varchar(3), @AreaCode) + ''''
set @sql = @sql + ' AND'
end

--trim off the last AND...
set @sql = left(@sql, len(@sql) - 3)

exec sp_sqlexec @sql



Answer this question

stop using dynamic sql

  • LamboJay

    Great.
    Thanks

  • jennitro

    Close, but what you want is to check to see if the parameter is null (assuming you don't have null values in the table, then you will want to revise your query.)

    create procedure usp_PatientManagementAdminGet

    @Year int = null,
    @YearPeriod int = null,
    @AreaCode varchar(3) = null

    as

    select
    *
    from
    tbl_Management
    where

    (@Year is null or [Year] = @Year)
    AND
    (@YearPeriod is null or YearPeriod = @YearPeriod)
    AND
    (@AreaCode is null or AreaCode = @AreaCode)

    GO

    For an excellent article covering the ins/outs/ups/downs of dynamic SQL, this article is awesome: http://www.sommarskog.se/dyn-search.html



  • stop using dynamic sql