sudhakarthikeyan Ответов: 2

Я попробовал SQL запрос показывает ошибку


SELECT A.farmer_id,B.firstname + '' '' + B.lastname + '' '' + B.surname             
   as farmer_name,A.farmer_season,B.gender,''-'' as farmerphoto,B.dateofbirth,B.birthlocation,B.fathername,B.mothername,            
   B.phonenumber,'''' as observation,B.nooffarms,B.produtionestimation,B.regionname,B.districtname as districtname,B.subdistrictname,B.villagename,B.sectionname,B.zonename,       
B.lastyearcooperative,B.currentyearcooperative as currentyearcoop,A.farm_no,
J.name as fieldstaffname,            
 A.farm_visitno,[OLAM DEV1 OLAMDEV1 OLAMDEV1],[Phonenumber]
   from (select farmer_name,A.farm_detailsdata
   FROM dbo.tbl_farmer_farmdetails_' + @originname + ' A  ) as a 
   PIVOT (MAX(A.farm_detailsdata) for farmer_name in ([OLAM DEV1 OLAMDEV1 OLAMDEV1], 
   [Phonenumber])) as b            
                         
   INNER JOIN dbo.tbl_farmerregistration_' + @originname + ' B ON B.farmerctscode = A.farmer_id            
 INNER JOIN dbo.tbl_villagemaster_' + @originname + ' C ON C.villageid = B.village 
INNER JOIN dbo.tbl_registration J ON J.regid = A.createdby    
 WHERE B.farmerseason = '2018'

Когда я выполняю вышеописанный запрос показывает ошибку следующим образом
Incorrect syntax near 'A'
Incorrect syntax near the keyword 'as'

в чем ошибка в моем вышеприведенном коде

Что я уже пробовал:

SELECT A.farmer_id,B.firstname + '' '' + B.lastname + '' '' + B.surname             
   as farmer_name,A.farmer_season,B.gender,''-'' as farmerphoto,B.dateofbirth,B.birthlocation,B.fathername,B.mothername,            
   B.phonenumber,'''' as observation,B.nooffarms,B.produtionestimation,B.regionname,B.districtname as districtname,B.subdistrictname,B.villagename,B.sectionname,B.zonename,       
B.lastyearcooperative,B.currentyearcooperative as currentyearcoop,A.farm_no,
J.name as fieldstaffname,            
 A.farm_visitno,[OLAM DEV1 OLAMDEV1 OLAMDEV1],[Phonenumber]
   from (select farmer_name,A.farm_detailsdata
   FROM dbo.tbl_farmer_farmdetails_' + @originname + ' A  ) as a 
   PIVOT (MAX(A.farm_detailsdata) for farmer_name in ([OLAM DEV1 OLAMDEV1 OLAMDEV1], 
   [Phonenumber])) as b            
                         
   INNER JOIN dbo.tbl_farmerregistration_' + @originname + ' B ON B.farmerctscode = A.farmer_id            
 INNER JOIN dbo.tbl_villagemaster_' + @originname + ' C ON C.villageid = B.village 
INNER JOIN dbo.tbl_registration J ON J.regid = A.createdby    
 WHERE B.farmerseason = '2018'

Когда я выполняю вышеописанный запрос показывает ошибку следующим образом
Incorrect syntax near 'A'
Incorrect syntax near the keyword 'as'

в чем ошибка в моем вышеприведенном коде

2 Ответов

Рейтинг:
0

OriginalGriff

Этот:

FROM dbo.tbl_farmer_farmdetails_' + @originname + ' A ) as a
Я совсем не уверен, что вы пытаетесь там сделать, но если вы пытаетесь передать часть имени таблицы в качестве параметра, то:
1) это не способ сделать это.
И
2) это очень плохая идея. Никогда не объединяйте параметры в SQL - команду - это оставляет вас широко открытыми для SQL-инъекций, которые могут повредить или уничтожить вашу базу данных.

Даже если вы добавите кавычки, чтобы заставить его компилироваться как команду, это все равно не сработает - вы не можете "построить" имя таблицы, не построив строку, которая является всей командой с ее параметрами, замененными и использующими EXEC для ее запуска.

Я думаю, что ваш дизайн базы данных нуждается в некоторой работе: это не очень хорошая идея иметь несколько таблиц, которые вы должны выбрать путем конкатенации!


Рейтинг:
0

CHill60

Если вы хотите построить имя таблицы таким образом, то вам нужно использовать динамический SQL - см.
Выполнение динамических команд SQL в SQL Server[^]

Вот простой пример

create table #table1 (i int, b int)
insert into #table1 values (1,2)

select * from #table1	--WORKS

declare @o varchar(10) = '1'
select * [from '#table' + @o]	-- DOES NOT WORK ... "Incorrect syntax near 'from '#table' + @o'."
Вам нужно сначала создать свою команду SQL, а затем выполнить ее
напр.
declare @sql nvarchar(max) = 'select * from #table' + @o 
EXEC sp_executesql @sql

Я действительно не понимаю, почему вы хотите параметризовать имя таблицы - вряд ли в этом есть реальная необходимость.

Вы должны попытаться избежать риска атаки SQL-инъекций, если собираетесь использовать параметризованные имена таблиц. Один из методов заключается в том, чтобы поместить допустимые имена таблиц в таблицу, в которую вы используете переданный параметр для поиска, например
create table #validnames(originname varchar(30), fulltablename varchar(255))
insert into #validnames (originname, fulltablename) values
('1', '#table1'),
('2', '#table2')
Тогда вы можете использовать его вот так
declare @tn varchar(255) = (SELECT fulltablename from #validnames where originname = @o)

IF @tn IS NULL
	RAISERROR (15600,-1,-1, 'myCode');  -- and exit your subroutine
ELSE
	SELECT @tn -- use this value in your dynamic sql
Если кто-то злонамеренно передал какой-то SQL как часть параметра, то его не будет в таблице, возвращаемое имя таблицы будет равно нулю и возникнет ошибка, защищающая вашу базу данных.