С Новым годом! Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 13.05.2015
Сообщений: 8

Заполнение таблицы через динамический запрос

19.04.2017, 13:40. Показов 1996. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
При выполнении данного кода
SQL
1
2
3
4
5
6
7
8
9
DECLARE @KS INT,@NAME NVARCHAR(50),@TYPE NCHAR(10),@OCENKA NCHAR(10),@PROPUSKI INT
DECLARE @SQL NVarchar(4000)
SET                @KS = 90
SET                @TYPE = 'ZACHET'
SET                @NAME='матан'
SET                @OCENKA = 'zach'
SET                @PROPUSKI = 5
SET                @SQL = 'INSERT INTO Матан (КС, Название, Тип, Оценка, Пропуски) VALUES ('+@KS+' ,'+@NAME+','+@TYPE+','+@OCENKA +','+@PROPUSKI+'  )'
EXEC sp_executesql @SQL
выдает ошибку:
Источник ошибки: .Net SqlClient Data Provider
Сообщение об ошибке: Ошибка преобразования значения varchar "'INSERT INTO Матан (КС, Название, Тип, Оценка, Пропуски) VALUES (" в тип данных int.
Помогите пожалуйста. Заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.04.2017, 13:40
Ответы с готовыми решениями:

Запрос на заполнение таблицы БД через форму php
Помогите пожалуйста найти ошибку. есть файл index.php в котором создана форма <?php include('db.php'); $quer =...

как создать запрос на заполнение в полей таблицы Access через delphi
как создать запрос на заполнение в полей таблицы Access через delphi, при помощи Editов

Запрос на заполнение таблицы из кода C#
Привет всем, столкнулся с такой проблемой: не могу найти, как вывести на SQL Server двумерный массив, созданный в C#. Подробнее:...

10
119 / 111 / 47
Регистрация: 09.07.2013
Сообщений: 209
19.04.2017, 13:46
T-SQL
1
SET @SQL = N'INSERT INTO Матан (КС, Название, Тип, Оценка, Пропуски) VALUES ('+CAST(@KS AS nvarchar)+' ,'+@NAME+','+@TYPE+','+@OCENKA +','+CAST(@PROPUSKI AS nvarchar)+'  )'
0
0 / 0 / 0
Регистрация: 13.05.2015
Сообщений: 8
19.04.2017, 14:02  [ТС]
Благодарю, но появилось новая проблема:

Источник ошибки: .Net SqlClient Data Provider
Сообщение об ошибке: "Недопустимое имя столбца "матан."
Недопустимое имя столбца "ZACHET."
Недопустимое имя столбца "zach.""

Код:
SQL
1
2
3
4
5
6
7
8
9
DECLARE @KS INT,@NAME NVARCHAR(50),@TYPE NCHAR(10),@OCENKA NCHAR(10),@PROPUSKI INT
DECLARE @SQL NVarchar(4000)
SET                @KS = 90
SET                @TYPE = 'ZACHET'
SET                @NAME='матан'
SET                @OCENKA ='zach'
SET                @PROPUSKI = 5
SET @SQL = N'INSERT Матан (КС, Название, Тип, Оценка, Пропуски) VALUES ('+CAST(@KS AS nvarchar)+' ,'+@NAME+','+@TYPE+','+@OCENKA +','+CAST(@PROPUSKI AS nvarchar)+'  )'
EXEC sp_executesql @SQL
А если прописать самому:
SQL
1
2
3
4
5
6
7
8
9
DECLARE @KS INT,@NAME NVARCHAR(50),@TYPE NCHAR(10),@OCENKA NCHAR(10),@PROPUSKI INT
DECLARE @SQL NVarchar(4000)
SET                @KS = 7
SET                @TYPE = 'ZACHET'
SET                @NAME='матан'
SET                @OCENKA ='zach'
SET                @PROPUSKI = 5
SET @SQL = N'INSERT Матан (КС, Название, Тип, Оценка, Пропуски) VALUES ('+CAST(@KS AS nvarchar)+' ,''матан'',''ZACHET'',''zach'','+CAST(@PROPUSKI AS nvarchar)+'  )'
EXEC sp_executesql @SQL
то работает. В чем может быть проблема?
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
19.04.2017, 14:52
в том, что во втором случае у вас текстовые константы обрамлены апострофами и воспринимаются как текстовые константы, а в первом случае без апострофов, просто следуют через запятую и воспринимаются как поля

Добавлено через 3 минуты
З.Ы. Ничего "динамического" я в ваших запросах не наблюдаю. Почему бы не написать честный и правильный запрос, а не формировать строку запроса?
0
0 / 0 / 0
Регистрация: 13.05.2015
Сообщений: 8
20.04.2017, 09:56  [ТС]
Потому что я пишу программу, в которой выбирается название предмета и с этим названием создается таблица. И как я понял, в SQL нет возможности использовать в некоторых частях запроса значения переменных, и единственным решением является использование строки запроса.

Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
System.Data.SqlClient.SqlConnection sqlConnection1 =
            new System.Data.SqlClient.SqlConnection("Data Source=(local);Initial Catalog=mod;Integrated Security=True");
 
            System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
            cmd.CommandType = System.Data.CommandType.Text;
            cmd.Connection = sqlConnection1;
 
            sqlConnection1.Open();
           
            cmd.Parameters.Add("@KS", SqlDbType.Int);
            cmd.Parameters.Add("@FIO", SqlDbType.NVarChar);
            cmd.Parameters.Add("@NAME", SqlDbType.NVarChar);
            cmd.Parameters.Add("@OCENKA", SqlDbType.NChar);
            cmd.Parameters.Add("@TYPE", SqlDbType.NChar);
            cmd.Parameters.Add("@PROPUSKI", SqlDbType.Int);
 
            cmd.Parameters["@FIO"].Value = textBox1.Text.Trim();
            cmd.Parameters["@OCENKA"].Value = comboBox2.Text.Trim();
            cmd.Parameters["@NAME"].Value = comboBox1.Text.Trim();
            cmd.Parameters["@TYPE"].Value = type;
            cmd.Parameters["@PROPUSKI"].Value = int.Parse(textBox2.Text);
            cmd.Parameters["@KS"].Value = i + 1;
           cmd.CommandText = "INSERT Студент (КС, ФИО) VALUES (@KS, @FIO)";
           cmd.ExecuteNonQuery();
            cmd.CommandText = "DECLARE @SQL varchar(8000)"+
             "SET @SQL = N'INSERT Матан (КС, Название, Тип, Оценка, Пропуски) VALUES ('+CAST(@KS AS nvarchar)+' ,'+@NAME+','+@TYPE+','+@OCENKA +','+CAST(@PROPUSKI AS nvarchar)+')'"
            + "exec sp_executesql @SQL";
 
            cmd.ExecuteNonQuery();
            sqlConnection1.Close();
Заранее извиняюсь, если в коде есть глупые ошибки, просто с sql недавно начал работать.
Миниатюры
Заполнение таблицы через динамический запрос  
0
119 / 111 / 47
Регистрация: 09.07.2013
Сообщений: 209
20.04.2017, 11:30
T-SQL
1
SET @SQL = N'INSERT INTO Матан (КС, Название, Тип, Оценка, Пропуски) VALUES ('+CAST(@KS AS nvarchar)+' ,'''+@NAME+''','''+@TYPE+''','''+@OCENKA +''','+CAST(@PROPUSKI AS nvarchar)+'  )'
1
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
20.04.2017, 11:39
Нужно
T-SQL
1
DECLARE @SQL nvarchar(8000)
1
0 / 0 / 0
Регистрация: 13.05.2015
Сообщений: 8
20.04.2017, 11:50  [ТС]
Заработало!!! Всем спасибо)
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
20.04.2017, 14:09
Цитата Сообщение от MRivaz Посмотреть сообщение
И как я понял, в SQL нет возможности использовать в некоторых частях запроса значения переменных, и единственным решением является использование строки запроса.
И как вы такое поняли? тем более что и в этом вашем коде я не увидел ни толики от динамического запроса.
С таким же успехом вы могли написать
C#
1
2
3
cmd.CommandText := 
  'INSERT Матан (КС, Название, Тип, Оценка, Пропуски) VALUES ' +
    '(:KS, :NAME, :TYPE, :OCENKA, :PROPUSKI )';
присвоить параметры и выполнить запрос.
0
0 / 0 / 0
Регистрация: 13.05.2015
Сообщений: 8
20.04.2017, 14:22  [ТС]
Таблица создается с именем, которая передается переменной @NAME. Если написать код так:
C#
1
2
3
cmd.CommandText := 
  'INSERT @NAME(КС, Название, Тип, Оценка, Пропуски) VALUES ' +
    '(:KS, :NAME, :TYPE, :OCENKA, :PROPUSKI )';
то он не будет работать.
З.Ы. Я в примере неправильный кусок кода вставил)
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
20.04.2017, 14:33
вы же не в SQL запрос генерируете, а на стороне, там бы и написали

C#
1
2
'INSERT ' + 'Матан' + '(КС, Название, Тип, Оценка, Пропуски) VALUES ' +
    '(:KS, :NAME, :TYPE, :OCENKA, :PROPUSKI )';
или переменную, а не константу, но в части имени таблицы, но не всего SQL-предложения. Хотя если пошли на создание персональной таблицы под каждую дисциплину, то вы явный клиент exec sp_executesql Успехов
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.04.2017, 14:33
Помогаю со студенческими работами здесь

Динамический запрос в oracle apex для вывода таблицы
Приветствую знатоков oracla, apexa и вообще pl sql разрабв. Прошу сразу не писать гневные комментарии я только учусь и пытаюсь разобраться....

Скрипт создание таблицы, заполнение данных, запрос
Здравствуйте. Пожалуйста, поделитесь информацией. Я ничего не понимаю, необходимую литературу на тривиальном языке найти, пока что не...

Динамический запрос с выбором полей через форму
Есть БД в которо Добавлено через 16 минут Есть таблица Sales, в которой отображены данные по продажам за определенный перод. Поля...

Динамический запрос с выбором полей через форму
Возник вопрос, пока теоретический: Хочу на форме разместить несколько контролов (checkbox) из нескольких связанных таблиц. Идея такая -...

Заполнение таблицы через update
здравствуйте! у меня есть табличка device с полями name и id. я ее заполнила...и добавила столбец descr, для каждого девайса оно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru