powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Динамический запрос
5 сообщений из 5, страница 1 из 1
Динамический запрос
    #40125995
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Есть такой SQL код, который при создании временной таблицы динамически задает количество цифр после запятой для определенного столбца.
Код: sql
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.
DECLARE @VarTemp SMALLINT = 1; -- Количество цифр после запятой

DROP TABLE IF EXISTS #MyTable1;

CREATE TABLE #MyTable1
(
	Id INT NOT NULL IDENTITY (1,1)
	,Column1 NVARCHAR(10)
	,Column2 DECIMAL(8, @VarTemp)
);

INSERT INTO #MyTable1
(
	Column1, Column2
)
SELECT
	Column1, Column2
FROM
	(VALUES
		('Value1', 10)
		,('Value2', 20.0)
		,('Value3', 30.1)
		,('Value4', 40.02)
	) t(Column1, Column2);

SELECT * FROM #MyTable1;

Не работает из за того, что в выделенном месте вставляем переменную.

Для решения этой проблемы использую динамический запрос (только CREATE TABLE #MyTable1). INSERT INTO #MyTable1 не нужно помещать в динамический запрос.
Код: sql
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.
DECLARE @VarTemp SMALLINT = 1; -- Количество цифр после запятой

DROP TABLE IF EXISTS #MyTable1;

DECLARE @SQL VARCHAR(MAX);
SET @SQL = '
CREATE TABLE #MyTable1
(
	Id INT NOT NULL IDENTITY (1,1)
	,Column1 NVARCHAR(10)
	,Column2 DECIMAL(8, '+ CAST(@VarTemp AS NVARCHAR(1)) + ')
)';

EXEC (@SQL);

INSERT INTO #MyTable1
(
	Column1, Column2
)
SELECT
	Column1, Column2
FROM
	(VALUES
		('Value1', 10)
		,('Value2', 20.0)
		,('Value3', 30.1)
		,('Value4', 40.02)
	) t(Column1, Column2);

Теперь пишет "Недопустимое имя объекта "#MyTable1"."

Как правильно написать, чтобы работало? Или в этом случае не получится из-за того, что #MyTable1 создается динамически?
...
Рейтинг: 0 / 0
Динамический запрос
    #40125996
Alex_Va
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ferzmikk,

##MyTable1

в конце скрипта удалите её
...
Рейтинг: 0 / 0
Динамический запрос
    #40126027
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Va,

Как вариант. Спасибо!
...
Рейтинг: 0 / 0
Динамический запрос
    #40126031
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Как вариант.
Не задумывались, что будет, если запустить одновременно несколько экземпляров этого варианта?

Код: sql
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.
31.
32.
33.
DECLARE @VarTemp SMALLINT = 1; -- Количество цифр после запятой

DROP TABLE IF EXISTS #MyTable1;

CREATE TABLE #MyTable1
(
	Id INT NOT NULL IDENTITY (1,1)
	,Column1 NVARCHAR(10)
	,Column2 DECIMAL(8, 0)
);

DECLARE @SQL VARCHAR(MAX);
SET @SQL = '
alter TABLE #MyTable1 alter column
	Column2 DECIMAL(8, '+ CAST(@VarTemp AS NVARCHAR(1)) + ')';

EXEC (@SQL);

INSERT INTO #MyTable1
(
	Column1, Column2
)
SELECT
	Column1, Column2
FROM
	(VALUES
		('Value1', 10)
		,('Value2', 20.0)
		,('Value3', 30.1)
		,('Value4', 40.02)
	) t(Column1, Column2);

select * from #MyTable1;
...
Рейтинг: 0 / 0
Динамический запрос
    #40126070
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Здравствуйте!

Есть такой SQL код, который при создании временной таблицы динамически задает количество цифр после запятой для определенного столбца.
Код: sql
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.
DECLARE @VarTemp SMALLINT = 1; -- Количество цифр после запятой

DROP TABLE IF EXISTS #MyTable1;

CREATE TABLE #MyTable1
(
	Id INT NOT NULL IDENTITY (1,1)
	,Column1 NVARCHAR(10)
	,Column2 DECIMAL(8, @VarTemp)
);

INSERT INTO #MyTable1
(
	Column1, Column2
)
SELECT
	Column1, Column2
FROM
	(VALUES
		('Value1', 10)
		,('Value2', 20.0)
		,('Value3', 30.1)
		,('Value4', 40.02)
	) t(Column1, Column2);

SELECT * FROM #MyTable1;

Не работает из за того, что в выделенном месте вставляем переменную.

Для решения этой проблемы использую динамический запрос (только CREATE TABLE #MyTable1). INSERT INTO #MyTable1 не нужно помещать в динамический запрос.
Код: sql
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.
DECLARE @VarTemp SMALLINT = 1; -- Количество цифр после запятой

DROP TABLE IF EXISTS #MyTable1;

DECLARE @SQL VARCHAR(MAX);
SET @SQL = '
CREATE TABLE #MyTable1
(
	Id INT NOT NULL IDENTITY (1,1)
	,Column1 NVARCHAR(10)
	,Column2 DECIMAL(8, '+ CAST(@VarTemp AS NVARCHAR(1)) + ')
)';

EXEC (@SQL);

INSERT INTO #MyTable1
(
	Column1, Column2
)
SELECT
	Column1, Column2
FROM
	(VALUES
		('Value1', 10)
		,('Value2', 20.0)
		,('Value3', 30.1)
		,('Value4', 40.02)
	) t(Column1, Column2);

Теперь пишет "Недопустимое имя объекта "#MyTable1"."

Как правильно написать, чтобы работало? Или в этом случае не получится из-за того, что #MyTable1 создается динамически?


Ваще-то абсолютно дурацкая затея. Создай максимальный DECIMAL(8,...) и пользуйся.
Но если совсем невмочЪ и заняться нечем - изучаем альтер табле альтер колумн...
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Динамический запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]