2011-05-10 3 views
2

Bonjour, je suis essentiellement d'essayer de le faire dans une nouvelle fenêtre d'affichage dans SQL Server 2008:SQL dynamique avec des variables dans une vue (SQL Server)

@var = déclarer (sélectionner db à partir de bases de données); Exec ('Sélectionnez le nom de' + @var '+ .dbo.Names)

Cette vue fonctionne réellement dans SQL Server mais je ne peux pas l'enregistrer (elle me donne une erreur), je pourrais potentiellement créer une fonction de retour de table, faire tous ces mêmes choses et retourner la table et créer une vue cela prend essentiellement tout de cette table mais je n'étais pas sûr des coups de performance qui pourraient survenir de le faire. Toutes les suggestions seraient grandement appréciées! Merci.

Je viens de finir par le faire abandonner l'ancienne vue et recréer une nouvelle vue (en utilisant SQL dynamique) dans une procédure stockée. Lorsque cette valeur est modifiée, j'appelle simplement le SP qui mettra à jour les vues pour pointer vers les bases de données correctes. Merci à tous les types d'aide, sachant que ce qui ne peut pas être fait m'a empêché d'essayer ces méthodes.

+0

Ce n'est pas valide dans une vue et AFAIK vous ne pouvez pas utiliser SQL dynamique dans les UDF non plus. –

+0

Bah! Y a-t-il un moyen d'obtenir ces résultats alors? Je viens de trouver qu'il était étrange que je puisse exécuter exactement cela dans SQL Server 2008 comme mon point de vue et ça s'est bien passé, mais il ne me laisserait pas enregistrer. –

+0

Le concepteur de vues dans SSMS est simplement le concepteur de requêtes graphique standard. Vous pouvez donc saisir toutes sortes de SQL arbitraires et les exécuter, mais cela ne veut pas dire qu'il est valide pour une vue! –

Répondre

1

La vue ne peut pas accepter les paramètres. Une fonction de valeur table est la solution. Mais vous devez au moins connaître la table et l'ensemble de résultats qui sortira de l'autre côté. Si vous passez la table à interroger en tant que paramètre, comment connaissez-vous la structure de l'ensemble de données résultant?

+0

Mais ce n'est pas un paramètre, c'est le nom de la base de données à utiliser. Ceci d'après ce que je peux dire doit être fait comme un exec (@string) car il n'y a pas d'autre moyen de définir l'objet. –

+0

Un UDF ne fonctionnerait pas. Il donne l'erreur "Utilisation invalide d'un opérateur affectant le temps ou dépendant du temps dans 'EXECUTE STRING' au sein d'une fonction " –

+0

Ouais juste essayé, je me demande si je pourrais créer une procédure stockée qui recréera la vue avec le nouveau ensemble de données? –

0

Vous pouvez facilement truquer une variable interne dans votre vue en utilisant CTE. Vous pouvez le tester dans votre version de SQL Server.

CREATE VIEW vwImportant_Users AS 
WITH params AS (
    SELECT 
    varType='%Admin%', 
    varMinStatus=1) 
SELECT status, name 
    FROM sys.sysusers, params 
    WHERE status > varMinStatus OR name LIKE varType 

SELECT * FROM vwImportant_Users 

rendement sortie:

status name 
12  dbo 
0  db_accessadmin 
0  db_securityadmin 
0  db_ddladmin 

aussi via JOIN

WITH params AS (SELECT varType='%Admin%', varMinStatus=1) 
SELECT status, name 
    FROM sys.sysusers INNER JOIN params ON 1=1 
    WHERE status > varMinStatus OR name LIKE varType 

aussi via CROSS APPLY

WITH params AS (SELECT varType='%Admin%', varMinStatus=1) 
SELECT status, name 
    FROM sys.sysusers CROSS APPLY params 
    WHERE status > varMinStatus OR name LIKE varType 
Questions connexes