2011-09-27 3 views
0

다음 문을 연결하는 데 문제가 있습니다.동적 SQL 연결

기본적으로 길이 열에 인치를 추가하고 싶지만 실행되지 않습니다. 앞으로이 기능을 만들 겠지만이 단계를 지나갈 수는 없습니다. 뭐라 구요?

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 + ' '[email protected]+ ' ' + ' 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) 

답변

1

은 내가 가정하고있어 ... 그냥 ...를 선택 포함 된 VARCHAR로 를 "길이"값을 캐스팅해야 '인치'문자열을 int로 또는 부동 소수점 값입니다 @ 다음 번에 결과 구문을 보려면 sql을 사용해야합니다. 여기에 작동해야합니다 변경 내용입니다 BTW ... EXEC sp_executesql 구현을 살펴보십시오 ... 매개 변수를 사용하여 동적 sql 덜 주입 suseptable 등 ... 온라인 설명서에서 위로 찾기 죄송합니다 ... 까마귀를 먹는 ... sp_executesql 주사에서 보호하지 못하면 일반적으로 성능이 향상됩니다 ... MSDN SQL Injection

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)) + ' + ''' '[email protected]+ ''' ' + ' 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

출력은;

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'