Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2017, 07:40   #21
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Так можно или нет все таки писать в селекте в ХП
Нельзя. А так можно
Код:
DECLARE @s varchar(2000)
SET @s = 'SELECT '+@ListFields+' FROM dbo.Tab'
EXEC (@s)
ЗЫ - если в базе есть таблица со списками полей доступных юзерам, то @ListFields можно не на клиенте, а в хранимке формировать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 14.06.2017 в 08:07.
Аватар вне форума Ответить с цитированием
Старый 14.06.2017, 08:53   #22
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Нельзя. А так можно
Код:
DECLARE @s varchar(2000)
SET @s = 'SELECT '+@ListFields+' FROM dbo.Tab'
EXEC (@s)
ЗЫ - если в базе есть таблица со списками полей доступных юзерам, то @ListFields можно не на клиенте, а в хранимке формировать
Да, вот именно, что я и хотел бы передавать список полей в @ListFields + чтобы потом клиент мог работать с данными этих полей через DBGrid и DBNavigator.
Правильно ли я понял, что такой код в ХП должен быть:
Код:
CREATE PROCEDURE [dbo].[Get1] 
	-- Add the parameters for the stored procedure here
	@ListFields varchar(255)
AS
BEGIN
        DECLARE @s varchar(2000)
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET @s = 'SELECT ' + @ListFields + ' FROM dbo.Tab';

       EXEC(@s)

    -- Insert statements for procedure here
END
GO
А?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.06.2017, 09:02   #23
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Код:
SET @s = 'SELECT ' + @ListFields + ' FROM dbo.Tab';
EXEC(@s)
Мелкомягкие рекомендуют для динамических запросов с параметрами юзать sp_executesql. Разницы в результате нет, но sp формирует в кэше один единственный план и подставляет в него значения параметров, в то время как EXEC каждый раз при запуске будет компилироваться с формирование нового плана. Ну и преобразование типов происходит автоматически - не нужно самому заморачиваться. Но это так, оффтопом.

Дабы не выглядеть голословным:

Короткая и понятная статья о различиях между sp_executesql и EXEC
Использование sp_executesql
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 14.06.2017 в 09:15.
Sciv вне форума Ответить с цитированием
Старый 14.06.2017, 09:04   #24
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Нельзя. А так можно
Код:
DECLARE @s varchar(2000)
SET @s = 'SELECT '+@ListFields+' FROM dbo.Tab'
EXEC (@s)
ЗЫ - если в базе есть таблица со списками полей доступных юзерам, то @ListFields можно не на клиенте, а в хранимке формировать
Да, вот именно, что я и хочу на клиенте передавать только в
Цитата:
Сообщение от Sciv Посмотреть сообщение
Мелкомягкие рекомендуют для динамических запросов с параметрами юзать sp_executesql. Разницы в результате нет, но sp формирует в кэше один единственный план и подставляет в него значения параметров, в то время как EXEC каждый раз при запуске будет компилироваться с формирование нового плана. Но это так, оффтопом.
Круто, парни!
Я написал ХП как предложил Аватар и проверил, передаю список полей и могу редактировать их там все какие надо и через сетку и через навигатор!
Так.
Sciv, т.е. это быстрее будет?
А куда его бабахнуть в мою ХП?
Код:
CREATE PROCEDURE [dbo].[Get1] 
	-- Add the parameters for the stored procedure here
	@ListFields varchar(255)
AS
BEGIN
        DECLARE @s varchar(2000)
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET @s = 'SELECT ' + @ListFields + ' FROM dbo.Tab';

       EXEC(@s)

    -- Insert statements for procedure here
END
GO
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.06.2017, 09:04   #25
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
А?
Ну так попробуй, проверить можно и без проги
Код:
EXEC Get1 'поле1,поле2,поле3,поле4'
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.06.2017, 09:12   #26
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ну так попробуй, проверить можно и без проги
Код:
EXEC Get1 'поле1,поле2,поле3,поле4'
Я уже проверил! Работает, в программе!
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.06.2017, 09:26   #27
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Sciv, т.е. это быстрее будет?
На больших базах не в разы, но ускоряет работу. На Вашей... не думаю

Вот безопасней точно будет.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 14.06.2017, 09:30   #28
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
На больших базах не в разы, но ускоряет работу. На Вашей... не думаю

Вот безопасней точно будет.
Так вместо чего его прописать в ХП?)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.06.2017, 10:14   #29
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Так вместо чего его прописать в ХП?)
Оно тебе надо? Разницы не заметишь )) Хочешь справку почитай по sp_executesql

https://docs.microsoft.com/en-us/sql...l-transact-sql

или здесь

https://technet.microsoft.com/ru-ru/...ql.110%29.aspx

Да и с безопасностью мало чего поменяется
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 14.06.2017 в 10:17.
Аватар вне форума Ответить с цитированием
Старый 14.06.2017, 10:28   #30
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Спасибо!
Кстати, допилил ХП так чтобы можно было передавать и любые поля и тянуть из указанной таблицы.
Вот, может кому пригодится идея:
Код:
CREATE PROCEDURE [dbo].[Ваша табличка :)] 
	@ListFields  varchar(255),
        @NameDict varchar(255)
AS
BEGIN
        DECLARE @s varchar(2000)
	SET @s = 'SELECT ' + @ListFields + ' FROM dbo.' + @NameDict;
        EXEC(@s)
END
GO
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача параметров в хранимой процедуре Maxjuvefan БД в Delphi 7 17.09.2015 14:09
Как зделать запрос в хранимой процедуре xatabich БД в Delphi 8 08.12.2014 08:08
Имена переменных в хранимой процедуре Muramidaza БД в Delphi 0 17.03.2014 22:44
Insert or Update в хранимой процедуре Dozent SQL, базы данных 4 15.10.2013 03:17
как отключить соединения с БД в хранимой процедуре Neymexa SQL, базы данных 0 06.04.2010 11:44