Ερώτηση:
Έχω ένα DB της Access και έναν SQL που αποθηκεύουν πληροφορίες. Στις δυνατότητες του Συνδεδεμένου διακομιστή SQL 7.0, έχω επιτρέψει στο SQL να βλέπει το DB της Access ως απλώς μια άλλη SQL δεδομένων. Έχω επίσης γράψει μια αποθηκευμένη διαδικασία που αντιγράφει εγγραφές από την Access DB στον SQL πίνακα. Η αποθηκευμένη διαδικασία εκτελείται από την ISQL/Query Analyzer και λειτουργεί σωστά. Η κλήση της αποθηκευμένης διαδικασίας από την Dexterity παράγει το ακόλουθο μήνυμα σφάλματος από το SQL Server: Τα ετερόκλητα ερωτήματα απαιτούν να ορίζετε τις επιλογές ANSI_NULLS και ANSI_WARNINGS για
τη σύνδεση. Αυτό εξασφαλίζει συνεπή σημασιτική ερωτήματος. Ενεργοποιήστε αυτές τις επιλογές και, στη συνέχεια, εκδοσή του ερωτήματός σας. Μπορώ ακόμη και να εκτελέσω αυτήν την αποθηκευμένη διαδικασία από το Dexterity;
Απάντηση:
Ναι, αλλά θα πρέπει να τροποποιήσουμε λίγο την αποθηκευμένη διαδικασία. Ο λόγος που αποτυγχάνει είναι ότι, για να διαβάσετε σωστά τους πίνακες του SQL στο Dexterity, αυτές οι επιλογές πρέπει να απενεργοποιηθούν, ώστε οι αποθηκευμένες διαδικασίες κλήσης στο Dexterity να αφορούν αυτές τις εντολές πριν από την εκτέλεση της αποθηκευμένης διαδικασίας. Ο χρήστης πρέπει να βεβαιωθεί ότι τα δεδομένα που παραβιάζουν αυτούς τους κανόνες δεν εισάγονται στον SQL πίνακα. Στο παρακάτω δείγμα, το table_access είναι ο πίνακας πρόσβασης. Το table_test είναι ο SQL πίνακας.
if exists (select * from sysobjects where id =
object_id('dbo.access_update') and sysstat & 0xf = 4)
drop procedure dbo.access_update
GO
create procedure dbo.access_update @O_SQL_Error_State int = NULL output
as
INSERT INTO access_table ( DOCNUMBR, DOCAMNT )
SELECT access_test.DOCNUMBR, access_test.DOCAMNT
FROM access_test
GO
Μπορούμε να τροποποιήσουμε την αποθηκευμένη διαδικασία για να ορίστε τις προειδοποιήσεις μας ως εξής:
if exists (select * from sysobjects where id =
object_id('dbo.access_update') and sysstat & 0xf = 4)
drop procedure dbo.access_update
GO
create procedure dbo.access_update @O_SQL_Error_State int = NULL output
as
set ANSI_NULLS ON
SET ANSI_WARNINGS ON
exec access_table2 ( DOCNUMBR, DOCAMNT )
GO
Σε αυτή την περίπτωση, στην αποθηκευμένη διαδικασία μεταβιβάζονται τα χαρακτηριστικά αυτού που την αποκαλεί. Για αυτή την περίπτωση, η κινητικότητα theaccess_tableprocedure το οποίο ενεργοποιεί το ANSI_NULLS & ANSI_WARNINGS και, στη συνέχεια, καλεί την πραγματική αποθηκευμένη διαδικασία και περνά στις παραμέτρους μας.
Αυτό το άρθρο ήταν Αναγνωριστικό εγγράφου TechKnowledge:10011