Pergunta

Eu preciso percorrer os campos em uma tabela e fazer algo se o seu valor não é igual o seu valor padrão.

Eu estou em um gatilho e então eu sei o nome da tabela. I ciclo, em seguida, através de cada um dos os campos que usam este loop:

select @field = 0, @maxfield = max(ORDINAL_POSITION) from
INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName

while @field < @maxfield
begin
...

então eu posso obter o nome do campo em cada iteração através do loop:

select @fieldname = COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = @TableName
and ORDINAL_POSITION = @field

E eu posso obter o valor padrão para essa coluna:

select @ColDefault = SUBSTRING(Column_Default,2,LEN(Column_Default)-2)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE Table_Name = @TableName
AND Column_name = @fieldname

Eu tenho tudo que preciso, mas eu não posso ver como, em seguida, comparar a 2. Devido Eu não tenho o nome do campo como uma constante, apenas em uma variável, não posso ver como obter o valor para fora da tabela de 'inserido' (lembre-se que eu estou em um trigger) a fim de ver se ele é o mesmo que o valor padrão (realizada agora em @ColDefault como um varchar).

Foi útil?

Solução

Em primeiro lugar, lembre-se que um gatilho pode ser disparado com vários registros chegando simultaneamente. Se eu fizer isso:

INSERT INTO dbo.MyTableWithTrigger
  SELECT * FROM dbo.MyOtherTable

então meu gatilho na MyTableWithTrigger terá de lidar com mais de um registro. O "inserido" pseudotable terá mais do que apenas um registro no-lo.

Dito isto, para comparar os dados, você pode executar uma instrução SELECT como esta:

DECLARE @sqlToExec VARCHAR(8000)
SET @sqlToExec = 'SELECT * FROM INSERTED WHERE [' + @fieldname + '] <> ' + @ColDefault
EXEC(sqlToExec)

Isso irá retornar todas as linhas da pseudotable inserido que não combinam com os padrões. Parece que você quer fazer alguma coisa com essas linhas, de modo que você pode querer fazer é criar uma tabela temporária antes de chamar essa seqüência @sqlToExec, e em vez de apenas selecionando os dados, inseri-lo em tabela temporária. Então você pode usar essas linhas para fazer o tratamento de exceções que você precisa.

Um problema - este T-SQL funciona apenas para campos numéricos. Você provavelmente vai querer construir a manipulação separada para diferentes tipos de campos. Você pode ter varchars, numerics, gotas, etc., e você vai precisar de diferentes formas de comparar os.

Outras dicas

Eu suspeito que você pode fazer isso usando e exec.

Mas por que não apenas o código gerar uma vez. Vai ser mais performant

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top