powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хранимая проц. заполняет таблицу значениями полей из разных таблиц. Как добавить еще поле?
9 сообщений из 9, страница 1 из 1
Хранимая проц. заполняет таблицу значениями полей из разных таблиц. Как добавить еще поле?
    #40009906
Vasilix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Имею 15-ти летний перерыв в работе с базами данных, если буду тупить - прошу не бить ногами...
Есть хранимая процедура, которая наполняет таблицу значениями из других таблиц этой же БД.
Задача - добавить в хранимую процедуру еще одно поле. Вроде бы ничего сложного, но что-то пошло не так - поле не заполняется.
- выборка полей для временной таблицы
Код: sql
1.
2.
3.
4.
5.
6.
IF OBJECT_ID('tempdb..#qatable') IS NOT NULL DROP TABLE #qatable
            
            SELECT ---distinct  
            welQA.SourceWorkLog_WorkID WorkID,QAresult, ql.ID,qtc.PLC_ID QATrigger, ql.ResultSetWhen -- добавил в выборку поле с ДатойВременем 
            INTO #qatable           
              FROM QualityLog ql



затем начинается наполнение с помощью курсора таблицы из временной таблицы #qatable

Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
DECLARE
                 @WorkID bigint
                ,@QAresult            NVARCHAR(max)
                ,@qaId                int
                ,@QATrigger              int
                ,@QAResultSetWhen     datetime --добавил локальную переменную
                DECLARE qa_cursor CURSOR FOR
                SELECT
                qt.WorkID
                    ,qt.QAresult
                    ,qt.ID
                    ,qt.QATrigger
                    ,qt.ResultSetWhen --добавил поле во временную таблицу
                FROM #qatable qt

                OPEN qa_cursor
                FETCH NEXT FROM qa_cursor
                INTO
                 @WorkID                 
                ,@QAresult        
                ,@qaId      
                ,@QATrigger      
                ,@QAResultSetWhen -- заполнил курсором поле
                WHILE @@FETCH_STATUS=0
                BEGIN
                    INSERT INTO x_1C_Buffer_MaterialReleaseQAResults (
                    QAResult,WorkID,QATrigger,QAResultSetWhen)                                         -- вставил в поле
                    VALUES (@QAresult,@WorkID,@QATrigger,@QAResultSetWhen    )      -- значение
            
                    DECLARE @m int = scope_identity()
                    INSERT INTO [x_1C_Buffer_MaterialReleaseQAResults_Cross] (QAResult_ID,QualityLogId)
                    values(@m,@qaId)           
                FETCH NEXT FROM qa_cursor
                INTO
                @WorkID
                ,@QAresult        
                ,@qaId
                ,@QATrigger    
                ,@QAResultSetWhen                 --продолжил читать
                END
                CLOSE qa_cursor
                DEALLOCATE qa_cursor             
            COMMIT


так же в таблицу x_1C_Buffer_MaterialReleaseQAResults добавил поле ResultSetWhen с типом DateTime.
Но при выполнении хранимой процедуры поле ResultSetWhen, не заполняется данными из временной таблицы.
Что-то я делаю не так, а что - не могу понять.
Подскажите, пожалуйста?
...
Рейтинг: 0 / 0
Хранимая проц. заполняет таблицу значениями полей из разных таблиц. Как добавить еще поле?
    #40009936
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasilix
Что-то я делаю не так, а что - не могу понять.
Всё правильно, ошибок в коде нет, поле добавлено.

Значит, либо транзакция откатывается, либо меняли в одной базе (сервере), а смотрите в другой.

Это же код в одной процедуре, а для проверки вы вызываете её из SSMS?
...
Рейтинг: 0 / 0
Хранимая проц. заполняет таблицу значениями полей из разных таблиц. Как добавить еще поле?
    #40009939
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasilix,

welQA .SourceWorkLog_WorkID WorkID,..., ql .ResultSetWhen

Левое соединение с QualityLog ql?
...
Рейтинг: 0 / 0
Хранимая проц. заполняет таблицу значениями полей из разных таблиц. Как добавить еще поле?
    #40009996
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist
Vasilix,

welQA .SourceWorkLog_WorkID WorkID,..., ql .ResultSetWhen

Левое соединение с QualityLog ql?
Да, правильно, забыл - первый совет: запустить запрос, и посмотреть на результат :-)
...
Рейтинг: 0 / 0
Хранимая проц. заполняет таблицу значениями полей из разных таблиц. Как добавить еще поле?
    #40010069
Vasilix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, есть левое соединение. Одно из полей таблицы наполняется собранной из множества полей из разных таблиц, собранных по шаблону. Но шаблон используется только для одного поля, и оно собирается корректно.

авторлибо меняли в одной базе (сервере), а смотрите в другой
у меня локальная копия базы, развернутой из бэкапа.

автора для проверки вы вызываете её из SSMS?
Да, так и есть. Может быть я не правильно запускаю процедуру в SSMS? я просто нажимаю "Выполнить F5". Появляется сообщение "Выполнение команд успешно завершено.Время выполнения: 2020-10-19T14:16:50.7466606+03:00". Потом иду смотрю на таблицу, но она не меняется.

Сейчас попробую посмотреть как отрабатывает запрос.

Запрос
Код: sql
1.
2.
SELECT welQA.SourceWorkLog_WorkID WorkID, ql.ID,qtc.PLC_ID QATrigger, ql.ResultSetWhen
			FROM QualityLog ql, WorkEventLog welQA, QualityTrigCondition qtc


отрабатывает корректно,
значит проблема в курсоре? Или во временной таблице?
...
Рейтинг: 0 / 0
Хранимая проц. заполняет таблицу значениями полей из разных таблиц. Как добавить еще поле?
    #40010076
Vasilix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот полный код хранимой процедуры, может я что-то упустил?
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[x_1C_QAResult]
AS
BEGIN
	BEGIN TRY
	    BEGIN TRANSACTION
IF OBJECT_ID('tempdb..#qatable') IS NOT NULL DROP TABLE #qatable
			
            SELECT ---distinct  
			welQA.SourceWorkLog_WorkID WorkID,QAresult, ql.ID,qtc.PLC_ID QATrigger, ql.ResultSetWhen
			INTO #qatable           
              FROM QualityLog ql
              JOIN WorkEventLog welQA on ql.ShipmentEventLog_ID is  null and ql.WorkEventLog_ID =welQA.ID  
			  JOIN QualityTrigCondition qtc ON qtc.ID=ql.QualityTrigCondition_ID
              CROSS APPLY( 
              SELECT 
            [dbo].[fnConcateTable]((
            SELECT distinct
            -- ISNULL(CAST(ml.PLC_ID                  AS NVARCHAR),'N/A') col
            --,ISNULL(CAST(welQA.SourceWorkLog_WorkID AS NVARCHAR),'N/A') col
            --,ISNULL(CAST(e.PLC_ID                   AS NVARCHAR),'N/A') col ,
            ISNULL(CAST(stpn.ID                    AS NVARCHAR),'N/A') col
            ,ISNULL(CAST(qpl.SampleParameter_Value  AS NVARCHAR),'N/A') col 
			FROM EquipmentLog el        
             LEFT JOIN Equipment e                ON e.Name =el.Equipment_Name and welQA.EquipmentLog_ID =el.ID
             JOIN WorkEventLog welProd            ON welProd.SourceWorkLog_WorkID =welQA.SourceWorkLog_WorkID and welProd.PhaseType_Description not like '%transfer%'
             JOIN ProductionLog pl                ON pl.WorkEventLog_ID = welProd.ID
             JOIN MaterialLog ml                  ON ml.ID = pl.MaterialLog_ID
             LEFT JOIN QualityParameterLog qpl    ON qpl.QualityLog_ID = ql.ID
             JOIN x_SampleTypeParameterNames stpn ON stpn.Name = qpl.SampleParameter_Name
              WHERE qpl.SampleParameter_Value is not null
              FOR XML RAW('tab'), ELEMENTS),'=',';') AS QAresult)s
              WHERE QAresult is not null 			 
			  AND ql.id =    (SELECT max(id) FROM QualityLog ql2 WHERE ql2.WorkEventLog_ID = ql.WorkEventLog_ID and ql2.SampleType_Description=ql.SampleType_Description and ql.QualityResult_Description=N'Approved')
			  and not exists (SELECT * FROM x_1C_Buffer_MaterialReleaseQAResults_Cross qarc WHERE qarc.[QualityLogId] = ql.ID)
				DECLARE 
			     @WorkID bigint
				,@QAresult            NVARCHAR(max)
				,@qaId                int
				,@QATrigger			  int
				,@QAResultSetWhen     datetime
				DECLARE qa_cursor CURSOR FOR
				SELECT
				qt.WorkID
					,qt.QAresult
					,qt.ID
					,qt.QATrigger
					,qt.ResultSetWhen
				FROM #qatable qt

				OPEN qa_cursor
				FETCH NEXT FROM qa_cursor
				INTO
				 @WorkID 				
				,@QAresult        
				,@qaId      
				,@QATrigger	  
				,@QAResultSetWhen 
				WHILE @@FETCH_STATUS=0
				BEGIN
					INSERT INTO x_1C_Buffer_MaterialReleaseQAResults (
					QAResult,WorkID,QATrigger,QAResultSetWhen
					) VALUES (@QAresult,@qaId ,@QATrigger,@QAResultSetWhen	)
			
			        DECLARE @m int = scope_identity()
			        INSERT INTO [x_1C_Buffer_MaterialReleaseQAResults_Cross] (QAResult_ID,QualityLogId)
			        values(@m,@qaId)
			
				FETCH NEXT FROM qa_cursor
				INTO 
				@WorkID 
				,@QAresult        
				,@qaId
				,@QATrigger	
				,@QAResultSetWhen
				END
				CLOSE qa_cursor

				DEALLOCATE qa_cursor 			
			COMMIT
	END TRY
	BEGIN CATCH
	 ROLLBACK TRANSACTION
		DECLARE @ErrorMessage NVARCHAR(255);
		SET @ErrorMessage = ERROR_MESSAGE();
		INSERT INTO errorlog (ErrorValue, ErrorMessage,ErrorTime, ObjectName, UserName)
		VALUES (680000,@ErrorMessage,GETDATE(),'x_1C_QAResult','DataCollection')
	END CATCH
END

		
...
Рейтинг: 0 / 0
Хранимая проц. заполняет таблицу значениями полей из разных таблиц. Как добавить еще поле?
    #40010079
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasilix
Вот полный код хранимой процедуры, может я что-то упустил?
1. Поставьте перед OPEN qa_cursor команду select * from #qatable
2. У вас там глухой try-catch
Поставьте туда хотя бы select @ErrorMessage as ErrorMessage
...
Рейтинг: 0 / 0
Хранимая проц. заполняет таблицу значениями полей из разных таблиц. Как добавить еще поле?
    #40010116
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо бы подумать над тем, чтобы переписать эту часть кода с OUTPUT выражением.
...
Рейтинг: 0 / 0
Хранимая проц. заполняет таблицу значениями полей из разных таблиц. Как добавить еще поле?
    #40010130
Vasilix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg Поставьте перед OPEN qa_cursor команду select * from #qatable

Эта команда и так уже стоит, только не со *, а с перечислением всех полей...

Люди добрые. Спасибо Вам за то что откликнулись. Виной всему мой фимоз головного мозга! Поле-то заполняется, но не каждая строка, а всего в 13-ти строках из 41000, а написать запрос :
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT 
      ,[QAResult]
      ,[WorkID]
      ,[QATrigger]
      ,[QAResultSetWhen]
  FROM x_1C_Buffer_MaterialReleaseQAResults
  WHERE QAResultSetWhen is not null


я догадался только сейчас. Единственное, что не понятно - это почему выводится только 13 строк, хотя их в 1000 раз больше.
Весь 2020 год не попадает... буду разбираться...

Еще раз всем спасибо, вы вернули мне веру в самого себя!
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хранимая проц. заполняет таблицу значениями полей из разных таблиц. Как добавить еще поле?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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