2015-12-24 2 views
4

Я пытаюсь манипулировать этим существующим кодом во время тестирования, он не ссылается на точное местоположение таблицы. Я имею в виду, что он не ссылается на имя и схему базы данных таблицы вместе с ее именем таблицы. Пример: если таблица называется '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 
+0

Могли бы вы вставить XML (или соответствующей его части)? У меня такое ощущение, что может быть лучший подход ... – Shnugo

+0

@Shnugo, Извините за опоздание, я был на собрании, у меня был включен код выше в обновлении – BruceyBandit

+0

Привет, без проблем, THX для XML. Будет ли это всегда «одно твердое заявление» или может быть несколько утверждений, упакованных в один Taks (или запись)? Правильно ли вы поняли, что хотите выполнить действие задачи против своей базы данных? Как выглядят XML-файлы в случае других операций CRUD? – Shnugo

ответ

0

Что-то вроде этого?

declare @x xml= 
'<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>'; 


DECLARE @DataBaseName VARCHAR(100)='MyDataBase'; 
DECLARE @DataBaseSchema VARCHAR(100)='MySchema'; 

WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS xsi) 
SELECT One.Record.value('order[1]','int') 
     ,'UPDATE ' + @DataBaseName + '.' + @DataBaseSchema + '.' + One.Record.value('TableName[1]','varchar(max)') 
     + ' SET ' + One.Record.value('(Update/FieldName)[1]','varchar(max)') + '=''' + One.Record.value('(Update/NewValue)[1]','varchar(max)') + ''' ' 
     + ' WHERE ' + One.Record.value('KeyField[1]','varchar(max)') + '=''' + One.Record.value('TableRef[1]','varchar(max)') + ''';' 
FROM @x.nodes('/Task/Record') AS One(Record) 

Это результат:

1 UPDATE MyDataBase.MySchema.ProductPerson SET StatusID='8' WHERE ProductPersonID='32420'; 
+0

Практически там, но мы должны представить, что мы не знаем точное местоположение базы данных и схемы таблицы, поэтому мы хотим, чтобы код мог найти его для нас и реализовать в xml. В вашем примере вы заявили, что знаете его в «MyDataBase» и «MySchema», но представьте, если мы этого не знаем, как мы можем его получить. Имеет ли это смысл? – BruceyBandit

+0

@BruceyBandit Где из заявления получить эту информацию? В каком состоянии вы это знаете? Как/откуда это называется? – Shnugo

+0

Мне нужно отступить, x-mas, family ... :-) удачи и счастливого кодирования. Пожалуйста, проголосуйте, если полезно, thx. – Shnugo

-1

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

Здоровые программы обычно используют только одну базу данных для хранения своих данных с требуемыми таблицами.

Однако, если вы все еще хотите работать с несколькими базами данных и схемами, вы можете динамически изменять подключение к базе данных, так как в этот момент выбрана база данных, с которой вы разговариваете.

Смежные вопросы