Я пытаюсь манипулировать этим существующим кодом во время тестирования, он не ссылается на точное местоположение таблицы. Я имею в виду, что он не ссылается на имя и схему базы данных таблицы вместе с ее именем таблицы. Пример: если таблица называется 'package'
, то на данный момент она просто выводит в операторе обновления «пакет», а не 'Holidays.dbo.package'
. Holidays
- это, очевидно, имя базы данных.Использование переменных для вызова [database]. [Schema]
Но вот проблема, с которой я ссылаюсь, может быть не в базе данных Holidays
, она может исходить из другой базы данных или схем, если на то пошло. Поэтому я не могу просто добавить update 'Holidays.dbo.' + @tablename
, мне нужно, чтобы он был более динамичным.
Вопрос в том, можно ли задать две переменные для вызова базы данных и схемы, как я могу установить для них переменные?
Ниже части кода я добытой, что я считаю, имеет отношение к этому вопросу:
declare @tablename varchar(MAX)
declare @loop int = 1
select a.* into #tmp
from
(
select RID,
v.value('local-name(.)', 'VARCHAR(MAX)') 'Field',
v.value('./text()[1]', 'VARCHAR(MAX)') 'Value'
from #XMLTemp
cross apply Field.nodes ('/Record/*') x(v)
where v.value('local-name(.)', 'VARCHAR(MAX)') not in ('Update', 'Filter', 'Insert', 'Delete')
) as a
where RID = @loop
...
select @tablename = ''
select @tablename = Value
from #tmp
where Field='tableName'
and RID = @loop
...
print 'update ' + @tablename + '
...
select @tablename = Value from #tmp where Field = 'TableName'
...
set @loop = @loop+1
UPDATE:
Ниже приведен XML для таблицы «ProductPerson» с новым значением и его предыдущее значение.
<Task xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Record>
<order>1</order>
<TableName>ProductPerson</TableName>
<KeyField>ProductPersonID</KeyField>
<TableRef>32420</TableRef>
<Update>
<FieldName>StatusID</FieldName>
<OldValue>3</OldValue>
<NewValue>8</NewValue>
</Update>
</Record>
</Task>
Ниже как генерируется XML:
BEGIN
-- Get details of any changes made
-- First are any update fragments stored
-- (basically these are the data changes)
select
z.value('(./FieldName/text())[1]', 'VARCHAR(MAX)') 'FieldName',
z.value('(./OldValue/text())[1]', 'VARCHAR(MAX)') 'OldValue',
z.value('(./NewValue/text())[1]', 'VARCHAR(MAX)') 'NewValue',
'Update' [Type]
into #Changes
from #XMLTemp t
cross apply field.nodes('/Record/*') y(z)
where z.value('local-name(.)', 'VARCHAR(MAX)') = 'Update'
and RID = @loop
UNION ALL
-- Now get any Filter changes (from addnlfragment)
-- These aren't data changes but are used for filtering.
select
z.value('(./FieldName/text())[1]', 'VARCHAR(MAX)') 'FieldName',
'' [OldValue],
z.value('(./FilterValue/text())[1]', 'VARCHAR(MAX)') 'NewValue',
'Filter' [Type]
from #XMLTemp t
cross apply field.nodes('/Record/*') y(z)
where z.value('local-name(.)', 'VARCHAR(MAX)') = 'Filter'
and RID = @loop
-- Only consider "update" types here - as filters may have blank old values for a specific field
set @update = ''
SELECT @update = COALESCE(@update , '') +
FieldName + iif (isnull(OldValue, 'NUL') = 'NUL', ' = ' +isnull(OldValue, 'NULL') + ',' , ' = ''' +isnull(OldValue, ' NULL ') +''',')
FROM #Changes
where Type ='Update'
-- Remove any extra commas from the end of the generated string
if(RIGHT(@update, 1) = ',')
BEGIN
set @update = substring(@update, 1, len(@update)-1)
END
Могли бы вы вставить XML (или соответствующей его части)? У меня такое ощущение, что может быть лучший подход ... – Shnugo
@Shnugo, Извините за опоздание, я был на собрании, у меня был включен код выше в обновлении – BruceyBandit
Привет, без проблем, THX для XML. Будет ли это всегда «одно твердое заявление» или может быть несколько утверждений, упакованных в один Taks (или запись)? Правильно ли вы поняли, что хотите выполнить действие задачи против своей базы данных? Как выглядят XML-файлы в случае других операций CRUD? – Shnugo