J'ai un site piloté par les données avec de nombreuses procédures stockées. Ce que je veux, à terme, être en mesure de faire est de dire quelque chose comme:Procédures stockées SQL Server - colonne de mise à jour basée sur le nom de la variable ..?
For Each @variable in sproc inputs
UPDATE @TableName SET @variable.toString = @variable
Next
Je voudrais qu'il soit en mesure d'accepter un certain nombre d'arguments.
Il va fondamentalement faire défiler toutes les entrées et mettre à jour la colonne avec le nom de la variable avec la valeur de la variable - par exemple la colonne "Nom" serait mise à jour avec la valeur de @Nom. Je voudrais essentiellement avoir une procédure stockée pour la mise à jour et une pour la création. Cependant, pour ce faire, je devrai être capable de convertir le nom réel d'une variable, pas la valeur, en une chaîne.
Question 1: Est-ce possible en T-SQL, et si oui, comment?
Question 2: Y a-t-il des inconvénients majeurs à utiliser quelque chose comme ceci (comme la performance ou l'utilisation du processeur)?
Je sais si une valeur n'est pas valide alors elle empêchera seulement la mise à jour impliquant cette variable et les suivantes, mais toutes les données sont validées dans le code de vb.net de toute façon donc seront toujours valides lors de la soumission à la base de données , et je vais m'assurer que seules les variables où la colonne existe peuvent être soumises.
Un grand merci à l'avance,
Cordialement,
Richard Clarke
Edit:
Je sais que sur l'utilisation des chaînes SQL et le risque d'attaques par injection SQL - j'ai étudié ce un peu dans ma thèse il y a quelques semaines.
Fondamentalement, le site utilise une architecture orientée objet. Il y a beaucoup de classes - par exemple Product - qui ont plusieurs "Attributes" (j'ai créé ma propre classe Attribute, qui a des propriétés telles que DataField, Name et Value où DataField est utilisé pour obtenir ou mettre à jour des données, Name est affiché sur l'administration Le frontend lors de la création ou de la mise à jour d'un produit et la valeur qui peut être affichée sur le frontend client est définie par l'administrateur DataField est le champ que j'utiliserai dans le "UPDATE Blah SET @Field = @Value"
Je sais que c'est probablement déroutant, mais c'est vraiment compliqué à expliquer - j'ai une très bonne compréhension de l'ensemble du système dans ma tête, mais je ne peux pas le mettre en mots facilement ..
Fondamentalement, la structure est configurée de telle sorte qu'aucun utilisateur sera en mesure de changer la valeur de DataField o r Nom, mais ils peuvent changer de valeur. Je pense que si je devais utiliser des chaînes SQL paramétrées dynamiques, il n'y aurait donc pas de risque d'attaques par injection SQL.
je veux dire essentiellement boucle à travers tous les attributs de sorte qu'il finit comme:
UPDATE Products SET [Name] = '@Name', Description = '@Description', Display = @Display
Puis boucle à travers tous les attributs encore et ajoutez les valeurs de paramètres - cela aura le même effet que l'utilisation des procédures stockées, droite?? Cela ne me dérange pas d'ajouter au temps de chargement de la page, car cela affectera principalement le frontend de l'administration, et affectera marginalement l'interface client.
Oserais-je demander pourquoi vous voulez faire cela? –
Je veux faire ceci afin de pouvoir ajouter des attributs, par exemple, à Product depuis l'interface d'administration. J'ai essentiellement un tableau de, par exemple, Product dans une classe "Manager" appelée ProductManager. ProductManager hérite de Manager, qui parcourt toutes les lignes de la table Products et crée une instance de Product pour chacun, avec les détails corrects, lors de sa création. Je voudrais étendre cela afin que les administrateurs aient la possibilité d'ajouter un attribut qu'ils peuvent ensuite utiliser sur l'interface client. Malheureusement cela signifie actuellement changer les sprocs à chaque fois .. – ClarkeyBoy