#sql #xml #sql-server-2008
#sql #xml #sql-сервер-2008
Вопрос:
У меня есть таблица
CREATE TABLE #tmp
(
ProcedureID INT ,
ProcedureName NVARCHAR(100) ,
OriginalVariableName NVARCHAR(200) ,
StatementNumber INT ,
RuleStatementID INT ,
StatementXML NVARCHAR(MAX) ,
CountOrg INT DEFAULT 0 ,
[Count] INT DEFAULT 0 ,
VarID INT ,
ParentID INT ,
ParentName NVARCHAR(100) ,
StatementType NVARCHAR(20) ,
[Type] NVARCHAR(3) ,
xml XML ,
str NVARCHAR(MAX) ,
Opindex INT ,
)
Я извлекаю дату из другой таблицы и вставляю в приведенную выше таблицу
В столбце StatementXML есть значения xml, такие же, как показано ниже
CUSTOMER-MASTER- RECORDXYZABCaabb
Я хочу найти значения тегов aa и bb, они могут быть пустыми или некоторыми значениями
если я нашел значения в обоих тегах, я хочу обновить столбец типа таблицы #tmp
Я хочу найти значения из тега и тегов
Например, — ID , столбец, значение 1 , ,
2 , XYZ , aa3, ABC, bb ….
…. …. в табличном формате
как я могу сделать это в процедуре хранения.
Пожалуйста, помогите здесь. в соответствии с generate values я хочу обновить некоторые значения в таблице others.
Я также проверяю приведенный ниже метод для этого, но я не получаю значения
declare @x xml = '<INSERT STATEMENTNUMBER="1595" CURSORNAME="" FILENAME="" INPUTTYPE="" RESPCODE=""><INSERTSTATEMENT>
<TABLES><TABLE><NAME>VIDEO-MASTER-RECORD</NAME><ALIAS></ALIAS></TABLE>
</TABLES><JOINS><JOIN><TYPE></TYPE><TABLE><NAME></NAME><ALIAS></ALIAS></TABLE></JOIN></JOINS>
<COLUMNS><COLUMN><NAME>VM-VIDEO-NUMBER</NAME></COLUMN><COLUMN><NAME>VM-TITLE</NAME></COLUMN><COLUMN><NAME>VM-MEDIA-TYPE</NAME>
</COLUMN><COLUMN><NAME>VM-STATUS</NAME></COLUMN><COLUMN><NAME>VM-CUSTOMER-NUMBER</NAME></COLUMN><COLUMN><NAME>VM-DATE-OUT</NAME></COLUMN></COLUMNS>
<VALUES>VIDEO-MASTER-RECORD</VALUES></INSERTSTATEMENT></INSERT>'
select @x.value('(/INSERT/@STATEMENTNUMBER)[1]', 'int') as STATEMENTNUMBER,
@x.value('(//COLUMN/NAME)[1]', 'varchar(max)') AS 'column1' ,@x.value('(//VALUES)[1]', 'varchar(max)') AS 'value1' INTO aa
Insert into aa select @x.value('(/INSERT/@STATEMENTNUMBER)[1]', 'int') as STATEMENTNUMBER, @x.value('(//COLUMN/NAME)[2]', 'varchar(max)') AS 'column1' ,@x.value('(//VALUES)[2]', 'varchar(max)') AS 'value1'
Insert into aa select @x.value('(/INSERT/@STATEMENTNUMBER)[1]', 'int') as STATEMENTNUMBER, @x.value('(//COLUMN/NAME)[3]', 'varchar(max)') AS 'column1' ,@x.value('(//VALUES)[3]', 'varchar(max)') AS 'value1'
Insert into aa select @x.value('(/INSERT/@STATEMENTNUMBER)[1]', 'int') as STATEMENTNUMBER, @x.value('(//COLUMN/NAME)[4]', 'varchar(max)') AS 'column1' ,@x.value('(//VALUES)[4]', 'varchar(max)') AS 'value1'
Insert into aa select @x.value('(/INSERT/@STATEMENTNUMBER)[1]', 'int') as STATEMENTNUMBER, @x.value('(//COLUMN/NAME)[5]', 'varchar(max)') AS 'column1' ,@x.value('(//VALUES)[5]', 'varchar(max)') AS 'value1'
Insert into aa select @x.value('(/INSERT/@STATEMENTNUMBER)[1]', 'int') as STATEMENTNUMBER, @x.value('(//COLUMN/NAME)[6]', 'varchar(max)') AS 'column1' ,@x.value('(//VALUES)[6]', 'varchar(max)') AS 'value1'
Insert into aa select @x.value('(/INSERT/@STATEMENTNUMBER)[1]', 'int') as STATEMENTNUMBER, @x.value('(//COLUMN/NAME)[7]', 'varchar(max)') AS 'column1' ,@x.value('(//VALUES)[7]', 'varchar(max)') AS 'value1'
Insert into aa select @x.value('(/INSERT/@STATEMENTNUMBER)[1]', 'int') as STATEMENTNUMBER, @x.value('(//COLUMN/NAME)[8]', 'varchar(max)') AS 'column1' ,@x.value('(//VALUES)[8]', 'varchar(max)') AS 'value1'
Insert into aa select @x.value('(/INSERT/@STATEMENTNUMBER)[1]', 'int') as STATEMENTNUMBER, @x.value('(//COLUMN/NAME)[9]', 'varchar(max)') AS 'column1' ,@x.value('(//VALUES)[9]', 'varchar(max)') AS 'value1'
Insert into aa select @x.value('(/INSERT/@STATEMENTNUMBER)[1]', 'int') as STATEMENTNUMBER, @x.value('(//COLUMN/NAME)[10]', 'varchar(max)') AS 'column1' ,@x.value('(//VALUES)[10]', 'varchar(max)') AS 'value1'
Я получил результат в таблице aa как
STATEMENTNUMBER column1 value1
1595 VM-TITLE NULL
1595 VM-MEDIA-TYPE NULL
1595 VM-STATUS NULL
1595 VM-CUSTOMER-NUMBER NULL
1595 VM-DATE-OUT NULL
1595 NULL NULL
1595 NULL NULL
1595 NULL NULL
1595 NULL NULL
1595 VM-VIDEO-NUMBER VIDEO-MASTER-RECORD
поэтому мне нужно обновить значение в соответствии с последней строкой, поскольку оба столбца имеют значения VM-VIDEO-NUMBER и VIDEO-MASTER-RECORD, я хочу игнорировать или удалять строки, в которых column1 или value1 имеют нулевые значения
Пожалуйста, посоветуйте
Комментарии:
1. вы можете попробовать использовать patindex и substring, но вам придется поиграть с ними, если у вас есть значения переменной длины
2. КАК Я МОГУ поместить переменную в запрос ниже — выберите @x.value(‘(/COLUMNS/ COLUMN / NAME)[1]’, ‘varchar(max)’), я хочу поместить переменную на место 1 [1] и вставить данные во временную таблицу, когда я поместите переменную, тогда она показывает ошибку, например — Аргумент 1 метода типа данных XML «value» должен быть строковым литералом.
3. это не имеет смысла. если вы хотите, чтобы [1] был параметром, почему бы просто не использовать всю эту строку ‘/COLUMNS/COLUMN/NAME/[1]’ в качестве параметра и объявить его в другом месте. — пожалуйста, уточните, потому что то, что вы спрашиваете, не имеет смысла.
4. В приведенном выше коде я просто помещаю значения в переменную, потому что я не знаю, сколько раз <name> тег в значении столбца, и я хочу, чтобы все значения были перенесены в другую таблицу, чтобы я мог проверить, что если у тега name и тега value есть значение, я обновлю статус в другой таблице, значит, если каждыйу тега name есть значения, а у того же тега value есть значение, тогда я могу выполнить другое действие, не нужно выполнять никаких действий
5. вам нужно привести лучший пример, потому что ваша логика не имеет смысла. можете ли вы отредактировать свой вопрос, чтобы иметь образец таблицы с образцами данных, которые вы запрашиваете. и покажите, каким вы хотите, чтобы ваш конечный результат был.