/ / Utilizzo di UDF per il valore predefinito di una colonna - sql-server, funzioni definite dall'utente

Utilizzo di UDF per il valore predefinito di una colonna - sql-server, funzioni definite dall'utente

Ho creato una UDF che sto usando per generare un valore predefinito per una colonna. Funziona alla grande, ma voglio passare un altro campo come parametro nella funzione. È possibile?

Ad esempio, uno dei campi è un campo DealerID e voglio passare il valore del campo DealerID al mio UDF perché lo userò per calcolare il nuovo valore. Qualsiasi aiuto sarebbe apprezzato!

risposte:

3 per risposta № 1

No, perché il valore predefinito sarà necessario prima che DealerID sia noto (ad esempio su INSERT)

Modificare:

Ciò significa che SQL Server non ha il valore nella tabella al momento dell'inserimento, solo dopo. Pertanto, non può UDF per l'impostazione predefinita.

Ad esempio, che dire di un inserimento di più righe o in cui hai NEWID () predefinito?

Ora, usando la logica di base su DealerID: se è il GUID, perché? È un valore interno, non leggibile dall'utente.

Se hai davvero bisogno di questo, dovrai usare una colonna calcolata per il valore "base" e un'altra colonna per il valore "reale" con ISNULL.


3 per risposta № 2

Ho avuto un problema simile dove volevoassegna automaticamente un slug URL per i nuovi record inseriti nella tabella. L'approccio che ho preso è stato quello di impostare il valore predefinito del campo su "NOTSET" (solo un valore di segnaposto di testo), quindi utilizzare un trigger di inserimento per aggiornare il campo ON INSERT al valore della mia UDF (dove il valore del campo è NOTSET) come segue:

CREATE TRIGGER [dbo].[TR_MyTable_MyTriggerName]
ON  [dbo].[tblMyTable]
AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Create the geography field from the lat and lon coordinates
UPDATE tblMyTable
SET fldURLSlug = dbo.UDF_MyFunction(INS.[fldRecordTitle])
FROM tblMyTable MT INNER JOIN inserted INS ON MT.fldRecordId = INS.fldRecordId
WHERE INS.fldURLSlug = "NOTSET"

END

GO

0 per risposta № 3

Per favore correggimi se hai una ragione specificaperché è necessario utilizzare una UDF, ma perché non basta definire il valore predefinito per la colonna nella tabella DDL, che verrà quindi sovrascritta se fornisci un valore specifico nel tuo UPDATE, INSERT eccetera.? Utilizzo di una UDF in a SELECT farà sì che la funzione venga eseguita su ogni riga, un overhead che salverà se è curato a livello di definizione della tabella.