Динамическая конкатенация SQL - PullRequest
0 голосов
/ 27 сентября 2011

Возникла проблема с конкатенацией следующего утверждения.

В основном я хочу, чтобы столбец длины добавлял дюймы после, но он не будет работать. Я собираюсь создать функцию из этого в будущем, но не смогу пройти этот шаг. Что дает?

declare @column varchar(255)
declare @sql varchar(5000)
declare @additional varchar(500)

set @column = 'length'

set @additional = 'inches'

select @sql = 'select distinct ps.p_c_id, '

select @sql = @sql +  @column + ' '+@additional+ ' ' + ' as value'

select @sql = @sql

select @sql = @sql + ' from dbo.Product ps
inner join dbo.ProductAttributes psa on psa.p_s_id = ps.p_s_id
where ps.p_c_id is not null and ' + @column + ' is not null'


exec (@sql)

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

Вы объединяете, что, я предполагаю, является значением типа int или float со строкой 'дюймы' ... нужно привести значение "length" как varchar ... просто выберите ваш @sql в следующий раз, чтобы увидетьрезультирующий синтаксис и он должен выскочить у вас.вот изменения, которые должны работать BTW ... посмотрите на реализацию EXEC sp_executesql ... делает динамический sql менее приемлемым для инъекций с использованием параметров и т. д. ... ищите в Books OnLine Извините ... есть Crow ... sp_executesql не делаетзащита от внедрения просто улучшает производительность в целом ... см. статью MSDN SQL-инъекция

declare @column varchar(255) 
declare @sql varchar(5000) 
declare @additional varchar(500) 

set @column = 'psa.length' 

set @additional = 'inches' 

select @sql = 'select distinct ps.p_c_id, ' 

select @sql = @sql + 'CAST(' + @column + ' AS varchar(10)) + ' + ''' '+@additional+ ''' ' + ' as value' 

select @sql = @sql 

select @sql = @sql + ' from dbo.Product ps 
inner join dbo.ProductAttributes psa on psa.p_s_id = ps.p_s_id 
where ps.p_c_id is not null and ' + @column + ' is not null' 

--select @sql AS [ExecutableSQL]
exec(@sql)
0 голосов
/ 27 сентября 2011

Ваш вывод:

select distinct ps.p_c_id, length inches  as value from dbo.Product ps
inner join dbo.ProductAttributes psa on psa.p_s_id = ps.p_s_id
where ps.p_c_id is not null and length is not null

Так что это выглядит как пропущенный , между length inches, при условии, что вы хотите оба;

select @sql = @sql +  @column + ','+ @additional+ ' ' + ' as value'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...