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

Откуда:
Сообщений: 54
Добрый день.
У меня небольшое непонимание.
Запрос
DECLARE @sql VARCHAR(max);

SELECT @sql = 'insert into Str_name_sc (id_spr,
descr,
id_subconto,
id_base,
id_spr_sc,
Descr_spr_sc) select ' + CONVERT(VARCHAR(20),dbo.spr_name.descr)+ 'as id_spr,'
+CONVERT(VARCHAR(20),dbo.spr_name.id)+' as descr,'
+CONVERT(VARCHAR(20),dbo.subkonto.id)+' as id_subconto,1 as id_base,
s.id, s.descr from SC'+ CONVERT(VARCHAR(20),RTRIM(LTRIM(dbo.spr_name.descr)))+ ' s'
FROM dbo.subkonto
LEFT JOIN dbo.spr_name ON dbo.subkonto.Значение=dbo.spr_name.id

EXEC (@sql)

должен вставить данные в таблицу. А вместо этого пишет что команда успешно завешена и все.
Данных в таблице нет.

Подскажите, чего я не увидела или не поняла. =(

Заранее спасибо!
1 июн 09, 11:17    [7250342]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Glory
Member

Откуда:
Сообщений: 104760
А как вы узнали, сколько записей выбрал select внутри вашего динамического запроса ?
1 июн 09, 11:19    [7250354]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Lio_K
Member

Откуда:
Сообщений: 54
Если написать просто
SELECT dbo.subkonto.Значение,dbo.spr_name.id
FROM dbo.subkonto
LEFT JOIN dbo.spr_name ON dbo.subkonto.Значение=dbo.spr_name.id

он выводит 1662 записи
1 июн 09, 11:20    [7250360]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
синтаксическая ошибка - как минимум по паре одинрных внутри динамического запроса вместо одной и нахуа динамика - совсем не понял ?
1 июн 09, 11:21    [7250361]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
По поводу того, что реально происходит на сервере, это надо смотреть Profiler-ом
(можно еще print Вашей переменной @sql)

У меня же другой вопрос:
Lio_K
DECLARE @sql VARCHAR(max);

SELECT @sql = 'insert into Str_name_sc (id_spr,
		descr,
		id_subconto,
		id_base,
		id_spr_sc,
		Descr_spr_sc) select ' + CONVERT(VARCHAR(20),dbo.spr_name.descr)+ 'as id_spr,'
		+CONVERT(VARCHAR(20),dbo.spr_name.id)+' as descr,'
		+CONVERT(VARCHAR(20),dbo.subkonto.id)+' as id_subconto,1 as id_base, 
 s.id, s.descr from SC'+ CONVERT(VARCHAR(20),RTRIM(LTRIM(dbo.spr_name.descr)))+ ' s'
FROM dbo.subkonto 
LEFT JOIN dbo.spr_name ON dbo.subkonto.Значение=dbo.spr_name.id

EXEC (@sql)
И зачем здесь вообще динамический SQL? Почему статическим нельзя?
1 июн 09, 11:22    [7250368]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Lio_K
Member

Откуда:
Сообщений: 54
Статически не увидела, как поэтому делаю динамически. Если можете подсказать как сделать статически будет просто замечательно.
А при написании print выводит пустую строку.
1 июн 09, 11:25    [7250388]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Glory
Member

Откуда:
Сообщений: 104760
Lio_K
Если написать просто
SELECT dbo.subkonto.Значение,dbo.spr_name.id
FROM dbo.subkonto
LEFT JOIN dbo.spr_name ON dbo.subkonto.Значение=dbo.spr_name.id

он выводит 1662 записи

Надо не просто написать. Нужно узнать, что получилось в динамическом запросе.
1 июн 09, 11:25    [7250389]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Lio_K
Member

Откуда:
Сообщений: 54
Glory
Lio_K
Если написать просто
SELECT dbo.subkonto.Значение,dbo.spr_name.id
FROM dbo.subkonto
LEFT JOIN dbo.spr_name ON dbo.subkonto.Значение=dbo.spr_name.id

он выводит 1662 записи

Надо не просто написать. Нужно узнать, что получилось в динамическом запросе.

Сообщение выше.
1 июн 09, 11:27    [7250404]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Lio_K
Если можете подсказать как сделать статически будет просто замечательно.
Для этого Вы должны выполнить Рекомендации по оформлению сообщений в форуме, пп.6 и 4
1 июн 09, 11:27    [7250413]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Lio_K
Member

Откуда:
Сообщений: 54
Паганель
Lio_K
Если можете подсказать как сделать статически будет просто замечательно.
Для этого Вы должны выполнить Рекомендации по оформлению сообщений в форуме, пп.6 и 4


попробую.
1 июн 09, 11:27    [7250423]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Lio_K
Member

Откуда:
Сообщений: 54
Паганель
Lio_K
Если можете подсказать как сделать статически будет просто замечательно.
Для этого Вы должны выполнить Рекомендации по оформлению сообщений в форуме, пп.6 и 4


Microsoft SQL Server 2005 - 9.00.3042.00 (X64) Feb 10 2007 00:59:02 Copyright (c) 1988-2005 Microsoft Corporation Developer Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)


таблица, в которую вставляю данне

CREATE TABLE [dbo].[Str_name_sc](
[id_spr] [int] NULL,
[descr] [char](23) NULL,
[id_subconto] [int] NULL,
[id_base] [int] NULL,
[id_spr_sc] [int] NULL,
[Descr_spr_sc] [char](23) NULL,
[id_num] [int] NOT NULL,
CONSTRAINT [PK_Str_name_sc] PRIMARY KEY CLUSTERED
(
[id_num] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
1 июн 09, 11:30    [7250447]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
ждал-ждал, решил на всякий случай спросить

автор, это всё?
а где скрипты создания таблиц subkonto и spr_name ?
где скрипты заполнения этих таблиц тестовыми данными ?
где описание желаемого результата на примере тестовых данных ?
1 июн 09, 11:44    [7250544]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Lio_K
Member

Откуда:
Сообщений: 54
Паганель
ждал-ждал, решил на всякий случай спросить

автор, это всё?
а где скрипты создания таблиц subkonto и spr_name ?
где скрипты заполнения этих таблиц тестовыми данными ?
где описание желаемого результата на примере тестовых данных ?


На примере ваших вопросов я исправляю код и нашла по крайней мере почему у меня print выводит пустые данные.



CREATE TABLE [dbo].[spr_name](
[id] [char](30) NULL,
[descr] [char](30) NULL,
[id_36] [char](9) NULL,
[id_base] [int] NULL,
[id_num] [int] IDENTITY(1,1) NOT NULL,
PRIMARY KEY CLUSTERED
(
[id_num] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


CREATE TABLE [dbo].[subkonto](
[id] [char](10) NULL,
[Значение] [char](30) NULL,
[vid] [char](30) NULL,
[id_36] [char](9) NULL,
[id_base] [int] NULL,
[id_num] [int] IDENTITY(1,1) NOT NULL,
PRIMARY KEY CLUSTERED
(
[id_num] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


таблицы заполняются в 1с. скриптов не знаю их заполнения.

хочу получить в результате

id_spr descr id_subconto id_base id_spr_sc Descr_spr_sc
15 Базы 152 1 1458 Налоги
1 июн 09, 11:49    [7250581]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
Lio_K
Статически не увидела, как поэтому делаю динамически. Если можете подсказать как сделать статически будет просто замечательно.
А при написании print выводит пустую строку.


значит в последней строке (той которая окажется в переменной @sql)
dbo.spr_name.descr или dbo.spr_name.id или dbo.subkonto.id или dbo.spr_name.descr равно NULL.

попробуй убрать
@sql =
и выполни

SELECT 'insert into Str_name_sc (id_spr,
		descr,
		id_subconto,
		id_base,
		id_spr_sc,
		Descr_spr_sc) select ' + CONVERT(VARCHAR(20),dbo.spr_name.descr)+ 'as id_spr,'
		+CONVERT(VARCHAR(20),dbo.spr_name.id)+' as descr,'
		+CONVERT(VARCHAR(20),dbo.subkonto.id)+' as id_subconto,1 as id_base, 
 s.id, s.descr from SC'+ CONVERT(VARCHAR(20),RTRIM(LTRIM(dbo.spr_name.descr)))+ ' s'
FROM dbo.subkonto 
LEFT JOIN dbo.spr_name ON dbo.subkonto.Значение=dbo.spr_name.id

пропиши для кажодй переменной ISNULL( ,'NULL')
и запусти снова....
1 июн 09, 11:54    [7250615]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Lio_K
Member

Откуда:
Сообщений: 54
сейчас попробую
1 июн 09, 11:56    [7250626]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Lio_K
таблицы заполняются в 1с. скриптов не знаю их заполнения.
там в рекомендациях есть пример хорошего стиля, в котором показано, как выглядит простейший скрипт заполнения таблицы тестовыми данными
создать такой скрипт (и опробовать его на какой-то тестовой базе) придется Вам
он наверняка маленький будет, Вам не составит труда его сделать
(а мне, не зная Вашу задачу - составит)
Lio_K
хочу получить в результате
id_spr descr id_subconto id_base id_spr_sc Descr_spr_sc
15 Базы 152 1 1458 Налоги
Хорошо, но пока непонятно на основании каких данных (нужен скрипт, о котором я говорил выше)
И еще. Нужно не просто показать желаемый результат, а объяснить Вашу задачу на его примере
(чаще всего в двух словах достаточно)
1 июн 09, 11:57    [7250638]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Lio_K
Member

Откуда:
Сообщений: 54
Некоторые ошибки увидела. Спасибо. С остальным постараюсь разобраться сама. Если не получится обращусь еще раз.

Большое вам спасибо.
1 июн 09, 12:01    [7250655]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
и еще
+ ISNULL(CONVERT(VARCHAR(20),''''+имя столбца+''''),'NULL')+ 
1 июн 09, 12:05    [7250684]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Lio_K
Member

Откуда:
Сообщений: 54
ветерочек,

Спасибо. Учту.
1 июн 09, 12:08    [7250706]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Lio_K
Member

Откуда:
Сообщений: 54
Появилась другая проблема.
Все прекрасно вставляется
Пример строки таблицы:

id_spr \\ descr \\ id_subconto \\ id_base \\ id_spr_sc \\ Descr_spr_sc

15150 \\ Статьи \\ 167121548 \\ 1 \\ 152698 \\ Платежи

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

insert into Str_name_sc (id_spr, descr, id_subconto, id_base, id_spr_sc, Descr_spr_sc) select convert(int,1564 ) as id_spr,'БанковскиеСчета ' as descr, convert(int,1124 ) as id_subconto, 1 as id_base, convert(char(10),s.id) as id_spr_sc, convert(char(23),s.descr) as Descr_spr_sc from [192.168.173.151].BaseABBuh.dbo.SC1564 s


Вопрос как можно сделать выполнение insert по всем записям? а не только по первой.
Заранее спасибо
1 июн 09, 12:20    [7250796]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Lio_K
Но запрос вставляет только первую строку
Какой запрос? Первоначальный ничего не вставлял
Вы его как-то изменили
А результат этого изменения не показываете...
1 июн 09, 12:23    [7250809]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Lio_K
Member

Откуда:
Сообщений: 54
Паганель
Lio_K
Но запрос вставляет только первую строку
Какой запрос? Первоначальный ничего не вставлял
Вы его как-то изменили
А результат этого изменения не показываете...



Видимо еще не адаптировалась к хорошему тону. Извините.

Вот он


SELECT '
insert into Str_name_sc (id_spr,
descr,
id_subconto,
id_base,
id_spr_sc,
Descr_spr_sc)

select convert(int,' + CONVERT(VARCHAR(20),dbo.spr_name.descr)+ ') as id_spr,'''

+CONVERT(CHAR(23),dbo.spr_name.id)+''' as descr,

convert(int,'+CONVERT(VARCHAR(20),dbo.subkonto.id)+') as id_subconto,

1 as id_base, convert(char(10),s.id) as id_spr_sc, convert(char(23),s.descr) as Descr_spr_sc

from [192.168.173.151].BaseABBuh.dbo.SC'+

CONVERT(VARCHAR(20),RTRIM(LTRIM(dbo.spr_name.descr)))+ ' s'

FROM dbo.subkonto

LEFT JOIN dbo.spr_name ON dbo.subkonto.Значение=dbo.spr_name.id

WHERE dbo.spr_name.id_base = 1 AND dbo.subkonto.id_base=1
1 июн 09, 12:28    [7250836]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Lio_K
SELECT '
insert into Str_name_sc (id_spr,
						descr,
						id_subconto,
						id_base,
						id_spr_sc,
						Descr_spr_sc) 		
		select convert(int,' + CONVERT(VARCHAR(20),dbo.spr_name.descr)+ ') as id_spr,'''
				+CONVERT(CHAR(23),dbo.spr_name.id)+''' as descr,
				convert(int,'+CONVERT(VARCHAR(20),dbo.subkonto.id)+') as id_subconto,
				1 as id_base, convert(char(10),s.id) as id_spr_sc, convert(char(23),s.descr) as Descr_spr_sc  
		from [192.168.173.151].BaseABBuh.dbo.SC'+ 
CONVERT(VARCHAR(20),RTRIM(LTRIM(dbo.spr_name.descr)))+ ' s'
FROM dbo.subkonto 
LEFT JOIN dbo.spr_name ON dbo.subkonto.Значение=dbo.spr_name.id
WHERE dbo.spr_name.id_base = 1 AND dbo.subkonto.id_base=1
0) не вижу в какую переменную помещается динамически сформированная строка запроса
1) не видно что у Вас сформировалось в динамике, очень желательно результат print приводить
2) Что это за таблицы такие [192.168.173.151].BaseABBuh.dbo.SC* и сколько в них записей?
3) А где where в динамически сформированном запросе? Неужели все записи нужно выбирать?
1 июн 09, 12:38    [7250899]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
Lio_K
Member

Откуда:
Сообщений: 54
Паганель
Lio_K
SELECT '
insert into Str_name_sc (id_spr,
						descr,
						id_subconto,
						id_base,
						id_spr_sc,
						Descr_spr_sc) 		
		select convert(int,' + CONVERT(VARCHAR(20),dbo.spr_name.descr)+ ') as id_spr,'''
				+CONVERT(CHAR(23),dbo.spr_name.id)+''' as descr,
				convert(int,'+CONVERT(VARCHAR(20),dbo.subkonto.id)+') as id_subconto,
				1 as id_base, convert(char(10),s.id) as id_spr_sc, convert(char(23),s.descr) as Descr_spr_sc  
		from [192.168.173.151].BaseABBuh.dbo.SC'+ 
CONVERT(VARCHAR(20),RTRIM(LTRIM(dbo.spr_name.descr)))+ ' s'
FROM dbo.subkonto 
LEFT JOIN dbo.spr_name ON dbo.subkonto.Значение=dbo.spr_name.id
WHERE dbo.spr_name.id_base = 1 AND dbo.subkonto.id_base=1
0) не вижу в какую переменную помещается динамически сформированная строка запроса
1) не видно что у Вас сформировалось в динамике, очень желательно результат print приводить
2) Что это за таблицы такие [192.168.173.151].BaseABBuh.dbo.SC* и сколько в них записей?
3) А где where в динамически сформированном запросе? Неужели все записи нужно выбирать?


1)print

insert into Str_name_sc (id_spr,
descr,
id_subconto,
id_base,
id_spr_sc,
Descr_spr_sc)

select convert(int,15150 ) as id_spr,'СтатьиЗатратУпр ' as descr,
convert(int,16712 ) as id_subconto,
1 as id_base, convert(char(10),s.id) as id_spr_sc, convert(char(23),s.descr) as Descr_spr_sc
from [192.168.173.151].BaseABBuh.dbo.SC15150 s

2) это таблицы справочников в 1с, а они имеют название SC****(* - номер id_spr). записей в них много. сколько точно в каждой не могу сказать.
3) нужно все записи.

Еще раз извините, что приходится Вам задавать так много вопросов мне, чтобы ответить на мои.
1 июн 09, 12:47    [7250949]     Ответить | Цитировать Сообщить модератору
 Re: Использование exec  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
DECLARE @sql VARCHAR(max);
SELECT @sql =@sql +.....
EXEC (@sql)
1 июн 09, 12:47    [7250950]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить