Invalid Column Name errors in dynamic query. Works in SQL Server 2008 but not in SQL Server 2012 -


i'm in middle of going sql server 2008 (not r2) sql server 2012. i've restored database sql server 2012 i'm getting runtime errors trying call dynamic query.

when call query asp, i'm getting 500 error, , in logs says have

invalid column name 'vendor'.

when run same procedure directly in ssms tells me have following errors:

msg 207, level 16, state 1, line 46
invalid column name 'vendor'.

msg 207, level 16, state 1, line 46
invalid column name 'type'.

msg 207, level 16, state 1, line 46
invalid column name 'subtype'.

msg 207, level 16, state 1, line 46
invalid column name 'custprice'.

here's code in stored procedure. problem occurring when @mode = 'search':

alter procedure [dbo].[spproductsearch]                 @idcompany      int = 0,                 @idbusiness     int = 0,                 @cat            int = 0,                 @subcat         int = 0,                 @idperson       int = 0,                 @target         nvarchar(99),                 @targetsql      nvarchar(99),                 @pricelower     money = 0,                 @priceupper     money = 999999999.99,                 @orderby        nvarchar(9),                 @grouping       int = 1,                 @instock        int = 0,                 @iscurrent      int = 0,                 @mode           nvarchar(99)   set nocount on  declare         @sql            nvarchar(4000),                                                 @paramlist      nvarchar(4000),                 @orderlit       varchar(99),                 @margin         decimal(9,5)   select  @margin = margin     company    idcompany = @idcompany                -- determine select statement  if @mode = 'consumables' begin     select @sql =          'select *                    dbo.printerconsumable pc              inner join  dbo.vwproductlistall p              on          pc.consumableid = p.productid                    p.idcompany = @idcompany              ,         pc.printerid = @target             ,         p.custprice between @pricelower , @priceupper' end  if @mode = 'drill' begin     -- if drilling down through desktop subcat, show unique skus vendorproductid , supplier     if @subcat = '1000010'         begin             select @sql =                  'select *                            dbo.vwproductlistall p                           inner join                         (select      vendorproductid, idsupplier, min(dealerbuy) mindealerbuy                                   dbo.product                         group vendorproductid, idsupplier) ps                          on ps.vendorproductid = p.productid , ps.idsupplier = p.idsupplier , ps.mindealerbuy = p.dealerprice                               p.idcompany = @idcompany                          ,         p.custprice between @pricelower , @priceupper'         end     else         begin             select @sql =                  'select *                            dbo.vwproductlistall p                                 p.idcompany = @idcompany                      ,         p.custprice between @pricelower , @priceupper'         end end  if @mode = 'favs' begin     select @sql =          'select *                    dbo.vwproductlistall p             inner join  dbo.productfavs pf on p.idproduct = pf.idproduct                   p.idcompany = @idcompany              ,         pf.idperson = @idperson             ,         p.custprice between @pricelower , @priceupper' end  if @mode = 'search' begin     select @sql =              'select b.businessname                                              vendor,                  pc.cat                                                          type,                  psc.subcat                                                      subtype,                    p.idproduct,                 p.vendorproductid                                               productid,                  p.description                                                   productdesc,                  100 * dbo.fncalcmargin(p.margin, psc.margin, pc.margin, @margin) margin,                 round(cast(p.dealerbuy + p.dealerbuy * dbo.fncalcmargin(p.margin, psc.margin, pc.margin, @margin) money), 2) custprice,                  cast(p.rrp - (p.dealerbuy + p.dealerbuy * dbo.fncalcmargin(p.margin, psc.margin, pc.margin, @margin)) money) saving,                 p.dealerbuy                                                     dealerprice,                  p.rrp,                 b.idbusiness,                 pc.idcat,                 psc.idsubcat,                 case isnull(p.url, '''')                 when '''' 0 else 1 end haslink,                  case isnull(p.imgurl, '''')                                  when '''' 0 else 1 end hasimage,                  case isnull(pi.productinfo, '''')                 when '''' 0 else 1 end hasinfo,                  case isnull(pi.overview, '''')                 when '''' 0 else 1 end hasoverview,                  case isnull(pi.keyfeatures, '''')                 when '''' 0 else 1 end haskeyfeatures,                  case isnull(pi.warrantyinfo, '''')                 when '''' 0 else 1 end haswty,                  p.idsupplier, s.suppliername, s.location, p.instock, p.due, p.iscurrent,                 p.imgurl, p.imgurl2, p.url, p.pdflink, p.isbulkfreight, p.isdoublefreight, p.isimported                        dbo.business b                   inner join      dbo.product p           on b.idbusiness = p.idbusiness             left outer join dbo.productinfo pi      on p.idproduct = pi.idproduct             inner join      dbo.supplier s          on p.idsupplier = s.idsupplier             inner join      dbo.productsubcat psc   on p.idsubcat = psc.idsubcat             inner join      dbo.productcat pc       on psc.idcat = pc.idcat                       p.idcompany = @idcompany              ,             (round(cast(p.dealerbuy + p.dealerbuy * dbo.fncalcmargin(p.margin, psc.margin, pc.margin, @margin) money), 2) between @pricelower , @priceupper)                ,             ((p.idproduct = @target) or (p.vendorproductid = @target) or (contains(p.description, @targetsql)))'  end  -- determine filter if @mode = 'drill' begin     if @idbusiness > 0           select @sql = @sql + '  , idbusiness = @idbusiness '      if @cat > 0           select @sql = @sql + '  , idcat = @cat '      if @subcat > 0           select @sql = @sql + '  , idsubcat = @subcat ' end  if @instock = 1     select @sql = @sql + ' , p.instock > 0'  if @iscurrent = 1     select @sql = @sql + ' , p.iscurrent = 1'  -- determine sorting if @orderby = 'desc'     select @orderlit = 'p.productdesc' else if @orderby = 'price'       select @orderlit = 'p.custprice' else     select @orderlit = 'p.productid'  -- determine grouping if @grouping = 1     select @sql = @sql + ' order p.vendor, p.type, p.subtype, ' + @orderlit else     select @sql = @sql + ' order ' + @orderlit  -- recompile hint see if resolves query timeout issue.  didn't! -- select @sql = @sql + ' option (recompile);'  -- setup parameter list  select @paramlist = '@idcompany     int,                      @idbusiness    int,                      @cat           int,                      @subcat        int,                      @target        nvarchar(99),                         @targetsql     nvarchar(99),                      @pricelower    money,                      @priceupper    money = 999999999.99,                      @margin        decimal(9,5),                      @idperson      int'      -- execute query exec sp_executesql @sql, @paramlist, @idcompany, @idbusiness, @cat, @subcat, @target, @targetsql, @pricelower, @priceupper, @margin, @idperson  if @@error <> 0      return (1)     --return success code (0) return (0) 

not sure if relevant or not, code written in sql server 2000. it's working okay in sql server 2008 instance. changed compatibility level of db 80 100 when imported 2012.

any appreciated.

thanks, mike.

the problem turned out order part of query.

-- determine sorting if @orderby = 'desc'     select @orderlit = 'p.productdesc' else if @orderby = 'price'       select @orderlit = 'p.custprice' else     select @orderlit = 'p.productid'  -- determine grouping if @grouping = 1     select @sql = @sql + ' order p.vendor, p.type, p.subtype, ' + @orderlit else     select @sql = @sql + ' order ' + @orderlit 

i removed p. infront of derived column names , query ran fine, ie:

-- determine sorting if @orderby = 'desc'     select @orderlit = 'productdesc' else if @orderby = 'price'       select @orderlit = 'custprice' else     select @orderlit = 'productid'  -- determine grouping if @grouping = 1     select @sql = @sql + ' order vendor, type, subtype, ' + @orderlit else     select @sql = @sql + ' order ' + @orderlit 

funny how working okay in sql2000 - 2008.


Comments

Popular posts from this blog

blackberry 10 - how to add multiple markers on the google map just by url? -

php - guestbook returning database data to flash -

delphi - Dynamic file type icon -