2010-03-20 6 views
6

Ich möchte diese Prozedur aufrufen, die einen Wert sendet, der NULL oder ein beliebiger Wert sein kann.Wie geht man mit SET ANSI_NULLS ON oder OFF?

Ich möchte einfach nur diese einzelne Abfrage verwenden, anstatt, was ich gerade in unten angegebenen Code mache.

Ich suchte nach diesem wie ich das tun könnte dann habe ich this Link.

dies nach I ANSI_NULLS OFF

Ich bin nicht in der Lage zu setzen dies in diesem Verfahren setzen, bevor meine SQL-Abfrage ausführen und dann wieder zurückgesetzt, nachdem dies zu tun.

ALTER PROCEDURE [Tags].[spOnlineTest_SubDomainSelect] 
    @SubDomainId INT 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    -- Insert statements for procedure here 
    IF @SubDomainId IS NULL 
     SELECT DomainName, DomainCode FROM Tags.tblDomain WHERE SubDomainId IS NULL 
    ELSE 
     SELECT DomainName, DomainCode FROM Tags.tblDomain WHERE SubDomainId [email protected] 
END 

Was wird die bessere Praxis mit ANSI_NULLS viel zu tun oder verwenden Wenn Else

Antwort

8

SET zu ändern ony bei gespeicherte Prozedur erstellen Zeit definiert und zur Laufzeit nicht eingestellt werden kann.

From CREATE PROC

Mit SET-Optionen

Der Datenbank-Engine speichert die Einstellungen sowohl SET QUOTED_IDENTIFIER und SET ANSI_NULLS, wenn ein Transact-SQL gespeicherte Prozedur erstellt oder geändert wird. Diese ursprünglichen Einstellungen werden verwendet, wenn die gespeicherte Prozedur ausgeführt wird. Daher werden alle Clientsitzungseinstellungen für SET QUOTED_IDENTIFIER und SET ANSI_NULLS ignoriert, wenn die gespeicherte -Prozedur ausgeführt wird. Andere SET Optionen wie SET ARITHABORT, SET ANSI_WARNINGS oder SET ANSI_PADDINGS werden nicht gespeichert, wenn eine gespeicherte Prozedur erstellt oder geändert wird. Wenn die Logik der gespeicherten Prozedur von einer bestimmten Einstellung abhängt, fügen Sie am Anfang der -Anweisung eine SET -Anweisung ein, um die entsprechende Einstellung zu gewährleisten. Wenn eine SET-Anweisung aus einer gespeicherten Prozedur ausgeführt wird, bleibt die -Einstellung nur wirksam, bis die gespeicherte Prozedur ausgeführt wurde.Die Einstellung wird dann auf den Wert zurückgesetzt, den die gespeicherte Prozedur beim Aufruf hatte. Dadurch können einzelne Clients die gewünschten Optionen festlegen, ohne die Logik der gespeicherten Prozedur zu beeinflussen.

Gleiches gilt für SET QUOTED_IDENTIFIER

In diesem Fall verwenden IF ELSE weil SET ANSI_NULLSON in der Zukunft sein wird.

Oder Peter Langs Vorschlag.

Um ehrlich zu sein, SubDomainId = @SubDomainId erwartet zu arbeiten, wenn @SubDomainId NULL ist, ist nicht wirklich die korrekte Verwendung von NULL ...

+0

@gbn thx für die Bereitstellung einer ziemlich guten Erklärung. –

2

Sie können nicht eine einzige Abfrage verwenden?

SELECT DomainName, DomainCode 
FROM Tags.tblDomain 
WHERE (@SubDomainId IS NULL AND SubDomainId IS NULL) 
    OR (SubDomainId = @SubDomainId) 
+0

@ Peter Lang: für Lösung thx, derzeit werde ich Training von ur-Lösung. Aber auch für ANSI_NULLS ist die Frage offen. –

0

FYI, ich bin ziemlich sicher ...

ANSI_NULLS OFF 

Gilt für den Vorgang, wenn Sie erstellen/bearbeiten es, es ist wie eine Einstellung des Verfahrens.

Also entweder die Prozedur hat es ON oder OFF. Ihr Beispiel war eine Abfrage, keine Prozedur, daher bin ich etwas verwirrt.

Aber wenn Sie SQL 2005/2008 zum Beispiel haben, wenn Sie "bearbeiten" Verfahren öffnet es Ihre Prozedur in einer neuen Registerkarte sehen Sie die ANSI_NULLS OFF oben.

Sie können es dort bearbeiten und ON oder OFF eingestellt und aktualisieren Sie es ...

ANSI_NULLS
+0

Hinweis, Sie können diese Einstellung auch in einer Abfrage verwenden ... Ich sage nur, wie es mit einer Prozedur funktioniert. –

+0

Ich versuche, es mit Abfrage zu verwenden. Ich arbeite gut für die Prozedur, d. H. Wenn ich es bei der Prozedur AUS mache. Aber ich möchte es nur für Abfrage deaktivieren. Irgendein Vorschlag ? –