2010-05-17 7 views
1

Tout d'abord, merci les gars. Vous savez toujours comment me diriger quand je ne trouve même pas les mots pour expliquer ce que j'essaie de faire.Résultat de la procédure stockée SQL Server 2008 en tant que valeur par défaut de la colonne

Les valeurs par défaut des colonnes sur un couple de mes tables doivent être égales au résultat de certains calculs compliqués sur d'autres colonnes dans d'autres tables. Ma première pensée est de simplement avoir la valeur par défaut de la colonne égale au résultat d'une procédure stockée. Je voudrais également avoir un ou plusieurs des paramètres tirés des colonnes dans la table appelante.

Je ne connais pas la syntaxe de la façon de le faire, et chaque fois que le mot "stocké" et "procédure" atterrit l'un à côté de l'autre dans google je suis inondé d'informations sur les valeurs par défaut à ce que je veux réellement. La moitié de cela était plus d'un évent qu'une question ... des idées cependant? Et plz plz ne dit pas "Eh bien, vous pouvez utiliser un déclencheur à l'insertion à ..."

+0

En fait, vous avez besoin d'un déclencheur 'INSTEAD OF INSERT' pour appliquer les valeurs par défaut de cette façon, pas d'insertion" on "(' FOR'/'AFTER'). La seule alternative est de n'avoir aucune valeur par défaut et d'utiliser une procédure stockée pour effectuer l'insertion réelle. – Aaronaught

+0

Il est probablement préférable de forcer toutes les insertions à utiliser un SP pour effectuer l'insertion plutôt que de se tromper avec les valeurs par défaut. –

Répondre

3

Vous devez convertir cette procédure stockée en une fonction définie par l'utilisateur. Il existe différents types d'UDF - celui que vous regardez serait le UDF scalaire - renvoyant une seule valeur.

Ainsi, par exemple, vous pouvez créer une fonction comme ceci:

CREATE FUNCTION dbo.YourDefaultFunction(@Input1 INT, @Input2 VARCHAR(10)) 
RETURNS VARCHAR(100) 
AS BEGIN 
    DECLARE @Result VARCHAR(100) 

    SET @Result = @Input2 + ' - giving: ' + CAST(@Input1 AS VARCHAR(5)) 

    RETURN @Result 
END 

Bien sûr, vôtre serait beaucoup plus compliqué :-)

Une fois que vous avez fait cela, vous pouvez définir cette à la valeur par défaut pour une colonne de type VARCHAR (100) - soit directement lors de la déclaration de la table, ou plus tard par l'intermédiaire d'une instruction ALTER TABLE:

CREATE TABLE dbo.YourTable(....... 
    SomeColumn VARCHAR(100)  
     CONSTRAINT DF_YourTable_SomeColumn 
     DEFAULT (dbo.YourDefaultFunction(417, 'Test')), 
    .....) 

ou:

ALTER TABLE dbo.YourTable 
    ADD CONSTRAINT DF_YourTable_SomeColumn 
    DEFAULT (dbo.YourDefaultFunction(4711, 'Test2')) 
    FOR SomeColumn 

Malheureusement, vous ne pouvez pas passer d'autres colonnes en tant que paramètres à votre fonction lorsque vous la définissez comme valeur par défaut pour une colonne.

Cela aide-t-il ??

4

Vous ne pouvez pas avoir le défaut est le résultat d'une procédure stockée, il doit être une fonction. Si vous pouvez convertir la procédure en fonction, vous pouvez utiliser cette fonction. Si vous ne pouvez pas, vous devez utiliser un déclencheur.

+0

Oui, une fonction. Bon de savoir ce que je voulais, c'est sous une forme possible. Vous ne seriez pas en mesure de fournir un simple extrait de comment mettre en œuvre que pourriez-vous? – instantmusic

+0

Voir les exemples D, J, K et L à http://msdn.microsoft.com/en-us/library/ms174979.aspx –

+0

Génial, ty tout le monde pour votre aide! ... Je vais garder les solutions de déclenchement à l'esprit aussi, espérant qu'elles ne sont pas mon seul choix à la fin. – instantmusic

Questions connexes