Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Динамический запрос / 5 сообщений из 5, страница 1 из 1
12.01.2022, 13:10
    #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
12.01.2022, 13:15
    #40125996
Alex_Va
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
ferzmikk,

##MyTable1

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

Как вариант. Спасибо!
...
Рейтинг: 0 / 0
12.01.2022, 15:29
    #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
12.01.2022, 17:18
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Динамический запрос / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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