2008-09-16 9 views
1

J'exécute des procédures stockées en utilisant SET FMTONLY ON, afin d'émuler ce que fait notre générateur de code. Cependant, il semble que les résultats sont mis en cache lorsqu'ils sont exécutés comme ceci, car je reçois toujours une erreur Conversion échouée d'un proc que je viens de laisser tomber! Cela se produit même lorsque j'exécute le proc sans SET FMTONLY ON.Problème avec SET FMTONLY ON

Quelqu'un peut-il me dire ce qui se passe ici?

+2

Duh! Je quittais FMTONLY réglé sur ON, et rien de ce que je faisais dans DDL ne semblait avoir d'effet. – ProfK

Répondre

1

Certaines déclarations seront encore exécutées, même avec SET FMTONLY ON. Vous "Erreur de conversion" erreur peut provenir de quelque chose d'aussi simple qu'une instruction set variable dans le proc stocké. Par exemple, cela renvoie les métadonnées pour la première requête, mais jette une exception quand il exécute la dernière déclaration:

SET FMTONLY on 

select 1 as a 

declare @a int 
set @a = 'a' 

En ce qui concerne l'exécution d'une procédure a chuté, c'est un nouveau pour moi. SQL Server utilise les tables système pour déterminer l'objet à exécuter, donc peu importe si le plan d'exécution est mis en cache pour cet objet. Si vous le supprimez, il est supprimé des tables système et ne devrait jamais être exécutable. Pourriez-vous interroger sysobjects (ou sys.objects) juste avant d'exécuter la procédure? Je pense que vous constaterez que vous ne l'avez pas laissé tomber.

0
  1. Cela ressemble à une erreur côté client. Recevez-vous le même message lors de l'exécution de SQL Management Studio? Avez-vous confirmé qu'il n'y a pas une autre procédure avec le même nom appartenant à un autre schéma/utilisateur?

0

Les instructions DDL sont analysées, mais ignorées lors de l'exécution si SET FMTONLY ON a été exécuté sur la connexion. Donc, si vous déposez un proc, une table, etc. lorsque FMTONLY est activé, l'instruction est analysée, mais l'action n'est pas exécutée.

Essayez ceci pour vérifier

SET FMTONLY OFF 

Table --create pour tester sur

CREATE TABLE TestTable (Column1 INT, Column2 INT) 

--insert 1 enregistrement

INSERT INTO TestTable (Column1, Column2) 
VALUES (1,2) 

--validate l'enregistrement a été inséré

SELECT * FROM TestTable 

--now le format réglé que sur

SET FMTONLY ON 

--columns sont retournés, mais aucune donnée

SELECT * FROM TestTable 

--perform instruction DDL avec FMTONLY ON

DROP TABLE TestTable 

- -Éteindre à nouveau FMTONLY OFF

SET FMTONLY OFF 

tableau --Le a été abandonnée au-dessus, donc cela ne devrait pas travailler

SELECT * FROM TestTable 

DROP TABLE TestTable 

SELECT * FROM TestTable