Здравствуйте! Сегодня: Чт, 22 Окт 2020, Ваш IP: 3.238.62.144 Войти через loginza
 
Вход | Регистрация | Забыли пароль?
Мой Kbyte.Ru
> Список форумов Kbyte.Ru - - Базы данных
+ Создать новую тему Страница: 1
Тема: Динамический SQL · +  +  дата добавления: 04.11.2012 / 22:34
Автор темы:
natalRez
natalRez
тем: 1 / ответов: 0 / благодарностей: 0 / репутация: 0
ответов: 0
создал(а) тем: 1


У меня есть БД. В ней есть несколько таблиц со словарем.
На таблицу codeCity
CityID (PK, identity, smallint, not null)
CityName (varchar(30), not null)
построила вот такую процедуру.

ALTER PROCEDURE [dbo].[up_i_u_codeCity]
(
@CityID smallint=null ,
@CityName varchar(max)=null)
AS
SET NOCOUNT ON

IF EXISTS (SELECT * FROM dbo.codeCity 
		 WHERE LTRIM(RTRIM(CityName)) = LTRIM(RTRIM(@CityName)))
		 AND LTRIM(RTRIM(@CityName)) IS NOT NULL OR LEN(LTRIM(RTRIM(@CityName)))>20 
	BEGIN
		IF LEN(LTRIM(RTRIM(@CityName)))>20   
			SELECT 'Length of city '+@CityName+ ' to long, not inserted.' as Not_allowad_length
		ELSE 
			SELECT 'Duplicate values not allowed' as Duplication
	END
	ELSE

IF EXISTS (SELECT * FROM dbo.codeCity
		 WHERE CityID = @CityID ) --and isnumeric(@CityID) 
		 AND LTRIM(RTRIM(@CityName)) IS NOT NULL 
	BEGIN

		UPDATE dbo.codeCity
		SET 
		CityName = @CityName
		WHERE CityID = @CityID

		SELECT 'City updated' as Successeful_update

	END

	ELSE
IF ISNULL(@CityName,'') = ''
		BEGIN
			SELECT 'No name introduced.' as Value_is_NULL
		END
	 ELSE
		BEGIN
			INSERT INTO dbo.codeCity VALUES (LTRIM(RTRIM(@CityName)))
			select 'City name inserted'
end		


 
--exec up_i_u_codeCity 
--exec up_i_u_codeCity '',' r jes2a '
--exec up_i_u_codeCity '9','jerjdkoghkusa'
--exec up_i_u_codeCity null,' 23fgh '

Как построить динамическую процедуру, что бы она проверила мою БД и на все однотипные таблицы (словари) построила такие же процедуры.
Например, на codeProfession, codeEducation
Технологии: Microsoft SQL Server
 
Ответ # 1 # · +  +  дата добавления: 05.11.2012 / 12:34
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Динамичный запрос можно построить и выполнить следующим образом:
DECLARE @q nvarchar(max); -- переменная для кода запроса
SET @q = 'SELECT * FROM dbo.codeCity  WHERE LTRIM(RTRIM(CityName)) = LTRIM(RTRIM(@CityName))) AND LTRIM(RTRIM(@CityName)) IS NOT NULL OR LEN(LTRIM(RTRIM(@CityName))'; -- код запроса может быть любым

-- выполнение запроса, в запрос передается переменная @CityName
EXEC sp_executesql  @q, N'@CityName varchar(max)', @CityName = @CityName;
При формировании запроса можно подставить любые инструкции и имена любых таблиц или полей из переменных:
DECLARE @q nvarchar(max);
DECLARE @table nvarchar(50);

SET @table = 'codeCity';

SET @q = 'SELECT * FROM ' + @table + '  WHERE какое-то условие и другой код';
EXEC sp_executesql  @q;
и т.п.
 
Ответ # 2 # · +  +  дата добавления: 27.11.2012 / 11:45
Автор ответа:
jj
jj
тем: 1 / ответов: 14 / благодарностей: 1 / репутация: 7
ответов: 14
создал(а) тем: 1


Замечательная дырка для инжекта
 
Страница: 1 + Создать новую тему