Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Отгадай загадку) как упростить простой запрос  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4348
ПользовательID = 12 - это пользователь с именем "отсутствует". Ну, так повелось уж.
UPDATE Штат
Set ПользовательID = 
    CASE 
        WHEN (Select ИмяID From оооченьсложныесвязи where дофигаусловий) is null THEN 12
        ELSE (Select ИмяID From оооченьсложныесвязи where дофигаусловий)
    END

Вопрос: как сделать так, чтобы внутренний длинный запрос выполнялся 1 раз, а не два?
Ограничение: всё должно быть "одной строкой", т.е. одним запросом без предварительно объявления переменных... поскольку запрос фигачится в DataSet'е в построителе запросов в Visual Studio, а там нельзя написать скрипт на SQL, только запрос.
13 янв 14, 16:50    [15409287]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
Узнать в хелпе о существовании функции ISNULL()
13 янв 14, 16:52    [15409298]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4348
Glory
Узнать в хелпе о существовании функции ISNULL()

не получится, я уже на форуме узнал от Glory :)
13 янв 14, 16:54    [15409311]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
наврено написать join с вашим "дофигасвязейиусловий"
13 янв 14, 16:56    [15409326]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Exproment
Member

Откуда:
Сообщений: 416
Maxx, +1
13 янв 14, 17:01    [15409353]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Charles Weyland
Ограничение: всё должно быть "одной строкой", т.е. одним запросом без предварительно объявления переменных... поскольку запрос фигачится в DataSet'е в построителе запросов в Visual Studio, а там нельзя написать скрипт на SQL, только запрос.

+ ограничение на все печатные символы
13 янв 14, 17:02    [15409365]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Гость888
Guest
автор
Ограничение: всё должно быть "одной строкой", т.е. одним запросом без предварительно объявления переменных... поскольку запрос фигачится в DataSet'е в построителе запросов в Visual Studio, а там нельзя написать скрипт на SQL, только запрос.


EXEC (' DECLARE @A int SET @A = 1 SELECT @A')
14 янв 14, 10:00    [15411773]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Charles Weyland
запрос фигачится в DataSet'е в построителе запросов в Visual Studio, а там нельзя написать скрипт на SQL, только запрос.
Странно как-то...
Даже в самых древних версиях Delphi это делается без проблем.
В компонентах ADO точно можно.

"Скрипт на SQL" и "только запрос" - это одно и то же, разве не так?
14 янв 14, 10:48    [15411943]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
spbit
Member

Откуда:
Сообщений: 3
Charles Weyland,

UPDATE Штат
   SET ПользовательID = ISNULL(ИмяID,12)
  FROM (SELECT ИмяID FROM оооченьсложныесвязи WHERE дофигаусловий) q
14 янв 14, 10:57    [15411967]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Гость888
Guest
Автор намекает на то, что не может в объявления переменных. Ну экзек ему в помощь.
14 янв 14, 11:00    [15411978]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4348
iap
"Скрипт на SQL" и "только запрос" - это одно и то же, разве не так?

под скриптом я понимаю программу на языке sql, состоящую из нескольких запросов
Declare @a int
Declare @persons int
Declare @chtotoeshe int
Select ...from ... where @persons ...
if @a = @chohoeshe then
select ...
else
select ...

exec (..) ...

ну а
select ...

или
update ...

каким бы сложным он не был, это всего лишь запрос. В единственном числе.
14 янв 14, 11:58    [15412302]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4348
spbit
Charles Weyland,

UPDATE Штат
   SET ПользовательID = ISNULL(ИмяID,12)
  FROM (SELECT ИмяID FROM оооченьсложныесвязи WHERE дофигаусловий) q

да, на самом деле, это именно то, что мне нужно было. Благо, Glory мне сразу подсказал (хоть и с пафосом:) ), я уже воспользовался этим))
14 янв 14, 12:01    [15412316]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
iap
Странно как-то...
Даже в самых древних версиях Delphi это делается без проблем.
В компонентах ADO точно можно.

Ничего странного - просто автор в VS умеет работать только с датасетами в дизайнере, и с запросами только в построителе.
14 янв 14, 12:01    [15412319]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4348
Сон Веры Павловны
Ничего странного - просто автор в VS умеет работать только с датасетами в дизайнере, и с запросами только в построителе.

запрос я пишу вручную, но, тем не менее, в датасете и он позволяет написать только запрос, но не целую процедуру.
Поделись, где можно писать программу (скрипт) на sql?
Раньше я делал это в текстовых строках непосредственно в коде. Формировал один большой запрос
string myquery = @"Declare @a int
Declare @persons int
Declare @chtotoeshe int
Select ...from ... where @persons ...
if @a = @chohoeshe then
select ...
else
select ...

exec (..) ..."

совал его в переменную и отправлял её на выполнение.
Теперь если нужна программа, делаю хранимки. Но это не всегда удобно, т.к. иногда требуется не захламлять сервер скриптами.
14 янв 14, 12:05    [15412354]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
RESEARCH
Member

Откуда:
Сообщений: 186
подскажи а каким образом ты создаешь хранимки ?
14 янв 14, 13:14    [15412921]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
Charles Weyland,

const string sql = @"
declare
  @c varchar(5);
set @c = convert(varchar(2),@a + @b)+@d;
select @a a, @b b, @c c";
var ds = new DataSet();
using (var cnn = new SqlConnection("Data Source=.;Initial Catalog=master;Integrated Security=True"))
using(var cmd = new SqlCommand(sql, cnn))
{
  cnn.Open();
  cmd.Parameters.AddWithValue("@a", 1);
  cmd.Parameters.AddWithValue("@b", 2);
  cmd.Parameters.AddWithValue("@d", "abc");
  using(var da = new SqlDataAdapter(cmd))
    da.Fill(ds);
}
foreach(DataRow dr in ds.Tables[0].Rows)
foreach(DataColumn dc in ds.Tables[0].Columns)
  Console.WriteLine("{0}: {1}", dc.ColumnName, dr[dc]);

отдельный вопрос - зачем в DataSet засовывать update.

P.S. Тема, думаю, для раздела по C# или ADO.NET.
14 янв 14, 14:03    [15413246]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4348
Сон Веры Павловны
отдельный вопрос - зачем в DataSet засовывать update.

чтобы вынести SQL код и всю его логику из C#, а не мешать в кучу.
очень приятно видеть в коде такую строку:
MyQuery.UpdateCompanies(18, "Луч света");
но вопрос в том, что сам этот UpdateCompanies, на сколько мне позволяют знания судить, позволяет выполнять только 1 запрос, а не целую программу.
14 янв 14, 14:16    [15413334]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
Charles Weyland
чтобы вынести SQL код и всю его логику из C#, а не мешать в кучу.

Если уж работа ведется с голым ADO.NET, то для апдейта не нужен никакой датасет, вполне хватит SqlCommand и SqlCommand.ExecuteScalar. Под кучей же, насколько я понимаю, подразумевается смешивание бизнес-лигики и логики обработки данных? Ну так обычно их разделяют по разным классам, вынося логику работы с данными в отдельную прослойку (DAL).
14 янв 14, 14:34    [15413467]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Сон Веры Павловны
Если уж работа ведется с голым ADO.NET, то для апдейта не нужен никакой датасет, вполне хватит SqlCommand и SqlCommand.ExecuteScalar
Не знаю зачем вы спустились до такого аргумента, но даже работа с таблами и тот же Update, которые применяет все изменения сделанные в DataSet работает через SqlDataAdapter где можно определить свой SqlCommandBuilder который можно для каждой примапленой таблы определять, делая любые сложные запросы.

Charles Weyland
MyQuery.UpdateCompanies(18, "Луч света");
но вопрос в том, что сам этот UpdateCompanies, на сколько мне позволяют знания судить, позволяет выполнять только 1 запрос, а не целую программу.
У вас очень низкий уровень знания по этому вопросу.

А в начале я даже не понял о чём речь. Этот дизайнер запросов сбивает с толку.

Задача касается разработки под .Net, вопрос надо перефразировать и задать в другом форуме. Хотя тут скорее надо базовые навыки по программированию наработать / выучить. Как копаться в библиотеках и фреймворках, познавать среду разработки.
Нужен ведущий разработчик у вас на работе, у кого бы это побыстрому налабать.
IMXO
15 янв 14, 03:48    [15416326]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Charles Weyland,

Ах да, банально все ваши Insert почему-то возвращают стразу же идентификатор новой строки.
Не волшебным образом, а просто там идёт вторая команда которая запрашивает Scope_Identity() или @@Identity.
15 янв 14, 03:55    [15416332]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
Mnior
Не знаю зачем вы спустились до такого аргумента, но даже работа с таблами и тот же Update, которые применяет все изменения сделанные в DataSet работает через SqlDataAdapter где можно определить свой SqlCommandBuilder который можно для каждой примапленой таблы определять, делая любые сложные запросы.

Update, приведенный в первом постинге темы - нет там никаких изменений в DataSet, там просто продекларированный update.
Ну, и да - с самого начала работы с .Net не люблю датасеты и адаптеры, есть такое. Либо SqlCommand/SqlDataReader, либо ORM. Но это частности.
15 янв 14, 06:02    [15416394]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4348
Mnior
Charles Weyland,

Ах да, банально все ваши Insert почему-то возвращают стразу же идентификатор новой строки.
Не волшебным образом, а просто там идёт вторая команда которая запрашивает Scope_Identity() или @@Identity.

вообще-то они возвращают количество обработанных строк. А чтобы вернуть Scope_Identity(), приходится специально писать "Select Scope_Identity() result" после запроса. Но, опять-таки, в "построителе" два селекта - это уже два запроса, а там можно ввести только один. Мне в таком случае приходится писать хранимую процедуру на сервере, что не совсем корректно, поскольку она там может мешаться.
15 янв 14, 09:31    [15416763]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4348
...либо SQL фигачить прямо в код, в строковую переменную.
15 янв 14, 09:33    [15416767]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
baracs
Member

Откуда: Москва
Сообщений: 7204
Charles Weyland
Мне в таком случае приходится писать хранимую процедуру на сервере, что не совсем корректно, поскольку она там может мешаться.
Последнюю фразу этого поста я комментировать поленился, но теперь стало совсем интересно: каким же образом хранимка может мешаться на сервере?
ХП очень неплохо подходят для того
Charles Weyland
чтобы вынести SQL код и всю его логику из C#, а не мешать в кучу.
15 янв 14, 10:22    [15416970]     Ответить | Цитировать Сообщить модератору
 Re: Отгадай загадку) как упростить простой запрос  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Сон Веры Павловны
да - с самого начала работы с .Net не люблю датасеты и адаптеры, есть такое. Либо SqlCommand/SqlDataReader, либо ORM. Но это частности.
Это не частности это суть проблемы. Общие следствия которой забивать гвозди микроскопом и задавать глупые вопросы, забивая другим голову мусором.
Charles Weyland
вообще-то они возвращают количество обработанных строк
Вообще-то ани (говоря непонятно о чём) могут делать много чего, а не только то что вы умеете на них делать.
Charles Weyland
приходится специально писать "Select Scope_Identity() result" после запроса
Вообще-то у этой функции область видимости - скоуп, в отдельном она не вернёт. А во вторых, повторяю - если вы так делаете - это не значит что по другому не работает - частая ошибка гуманитариев. Простите уж меня.
Charles Weyland
в "построителе"
Заладили вы уже с ним. Вы контекст моего разговора поняли?
Charles Weyland
приходится писать хранимую процедуру
Не приходится, а лень, ибо надо научится писать по другому. "Лучше уже не знать и совершенно неадекватно воспринимать реальность, и спорить с другими". Да? И вот так тоже заблуждаться:
Charles Weyland
поскольку она там может мешаться.

Charles Weyland
...либо SQL фигачить прямо в код, в строковую переменную.
Ужас то какой - "не по феншую!!!".
1. Это нормальное явление (и не переменную а просто - строковая константа)
2. Это не нужно по многим причинам в ракурсе "проблемы"
Charles Weyland
spbit
UPDATE Штат
   SET ПользовательID = ISNULL(ИмяID,12)
  FROM (SELECT ИмяID FROM оооченьсложныесвязи WHERE дофигаусловий) q
да, на самом деле, это именно то, что мне нужно было
Оно то да, но вам дали следствие простого правила, понимания, что затруднит вам решать в общем виде.
В итоге вы будете приходить и спрашивать похожие вопросы.
К тому же вы не знаете синтаксис UPDATE - ибо это частный, очень ограниченный случай, который лучше даже не знать. А общий синтаксис позволяет делать любые виды изменений, как топорные так и сложные. Имя таблицы после слова UPDATE - признак не профессионализма и скорее непонимания сути вещей.
А суть проблемы в понимании что есть FROM, что в нём пишется, как самое важное и обязательное в любом запросе.
Некоторые думают что незнание JOIN это просто незнание какой-то незначительной и не базовой вещи. LOL

Надеюсь вы понимаете теперь куда расти и что почитать, и приняли это как советы, а не как "наезды" или "порку" или какая либо "неприязнь".
Надеюсь на положительное восприятие.
15 янв 14, 10:27    [15416995]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить