SSRS 2012- Αποφύγετε την καθιστούν μια αναφορά όταν δεν υπάρχουν γραμμές για να επιστρέψετε




Αναρωτιέμαι αν υπάρχει κάποιος δυνατός τρόπος για να αποφευχθεί η έκθεση να εκτελέσει ή να τρέξει όταν δεν υπάρχουν γραμμές που μπορούν να επιστραφούν στον SQL Server Reporting Services 2012. Με άλλα λόγια, δεν υπάρχουν γραμμές στο σχέδιο προϋπολογισμού που πρέπει να επιστραφεί. 


Είμαστε προσπαθούν να μειώσουν την ποσότητα των E-mails που αποστέλλονται από την πρόληψη εκθέσεις τρέχει όταν δεν υπάρχει τίποτα να δείξει.


Ευχαριστώ πολύ


Marcus
Συχνά αυτό επιτυγχάνεται με τη χρήση [«Driven δεδομένων Συνδρομές»](https://msdn.microsoft.com/en-us/library/ms169673.aspx) , αλλά αυτή η λειτουργία είναι διαθέσιμη μόνο σε ορισμένες εκδόσεις του SQL: Enterprise και Business Intelligence, αλλά όχι στο πρότυπο.


Έτσι, υπάρχει μια σειρά από δημιουργικές λύσεις. Αλλά δεν μου αρέσει κάποια από αυτές, και απαιτούν ένα δίκαιο κομμάτι της εργασίας έξω από SSRS.


Οι λύσεις που έχω δει περιλαμβάνουν: Δημιουργία της εγγραφής και στη συνέχεια απενεργοποίηση ή επιτρέπουν την εργασία SQL που στέλνει τη συνδρομή (που προσδιορίζονται από GUID.)


Δημιουργήστε ένα .exe .NET περιτύλιγμα για να χειριστεί την αποστολή του email. Μπορεί να εκτελέσετε το ερώτημα πρώτα να δούμε πόσα επέστρεψε σειρές, και στη συνέχεια, αν χρειαστεί, να δημιουργήσει την έκθεση και να συμπεριληφθεί σε ένα email.
Υπάρχει μια μεγάλη διαφορά. LINQ-to-SQL ερωτημάτων επιλογής μπορεί να είναι μεγάλες σύνθετες εκφράσεις δέντρα. Της αυτά που μπορεί να λάβει κάποια «σύνταξη». Στην περίπτωση αυτή συνενώνονται σε κάποιο T-SQL που μπορεί να τρέξει εναντίον του SQL Server. Έτσι είναι λογικό να αποθηκεύουν προσωρινά το αποτέλεσμα μιας πράξης, έτσι ώστε να μπορεί να επαναχρησιμοποιηθεί.


Ωστόσο άλλες Διαγραφή, ενημέρωση, και Εισαγωγή είναι απλές λειτουργίες που δεν απαιτούν ένα δέντρο έκφραση για να μετατραπεί σε T-SQL (το ίδιο LINQ είναι όλα σχετικά με την αναζήτηση). Του ακριβώς ατυχές το γεγονός ότι έχουμε εκπαιδευτεί να σκέφτονται SQL κώδικα που εκτελεί αυτές τις άλλες λειτουργίες ως «ερωτήματα», δεν είμαστε actuall ζητούν οποιαδήποτε πληροφορία.


Οι πράξεις αυτές ορίζονται μόνο από την DataContext όχι από LINQ ως εκ τούτου, τον κωδικό για να εκτελέσετε αυτές τις λειτουργίες είναι ήδη συνταχθεί. Η καλύτερη εξήγηση που έχω δει είναι στο κεφάλαιο 7 των ελεύθερων [Ιδρύματα Προγραμματισμού e-book](http://codebetter.com/karlseguin/2008/06/25/foundations-of-programming-ebook/) .


Βασικά, σε **ΝΕΤ** παρουσιάζεται διαρροή μνήμης όταν τα αντικείμενα αναφοράς τις ρίζες και έτσι δεν μπορεί να σκουπίδια συλλέγονται. Αυτό συμβαίνει κατά λάθος, όταν κρατάτε για τις αναφορές πέρα από το σκοπούμενο πεδίο εφαρμογής.


Θα γνωρίζετε ότι έχετε διαρροές όταν ξεκινάτε να πάρει OutOfMemoryExceptions ή τη χρήση της μνήμης σας ανεβαίνει πέρα από αυτό που θα περίμενε κανείς ( **PerfMon** έχει ωραία μετρητές μνήμης).


Κατανόηση **ΝΕΤ** μοντέλο μνήμης «s είναι ο καλύτερος τρόπος για σας να αποφευχθεί αυτό. Συγκεκριμένα, την κατανόηση του πώς λειτουργεί ο συλλέκτης σκουπιδιών και πώς αναφορές λειτουργούν - και πάλι, σας παραπέμπω στο κεφάλαιο 7 του e-book. Επίσης, να λαμβάνει υπόψη της τις κοινές παγίδες, ίσως τα πιο κοινά είναι τα γεγονότα. Εάν το αντικείμενο **Α** έχει καταχωρηθεί σε μια εκδήλωση στο αντικείμενο **Β** , τότε αντιρρήσεις **Α** θα μείνω μέχρι το αντικείμενο **Β** εξαφανιστεί λόγω **B** κατέχει αναφορά στο **Α** . Η λύση είναι να καταργήσετε τις εκδηλώσεις σας, όταν τελειώσετε.


Φυσικά, ένα καλό προφίλ μνήμης θα σας αφήσει να δείτε το αντικείμενο γραφήματα σας και να εξερευνήσετε το φώλιασμα / αναφορά των αντικειμένων σας για να δείτε πού είναι οι αναφορές προέρχονται από και ποια ρίζα αντικείμενο είναι υπεύθυνος ( [προφίλ μυρμήγκια κόκκινο-πύλη](http://www.red-gate.com/products/ants_memory_profiler/index.htm) , JetBrains dotMemory, [memprofiler](http://memprofiler.com/) είναι πραγματικά καλό επιλογές, ή μπορείτε να χρησιμοποιήσετε το κείμενο-μόνο **WinDbg** και **SOS** , αλλά θα ήθελα να συνιστούμε ένα εμπορικό / οπτική του προϊόντος, εκτός αν είστε ένας πραγματικός γκουρού).


Πιστεύω μη διαχειριζόμενο κώδικα υπόκειται σε τυπικό διαρροές μνήμης, εκτός από το ότι μοιράζονται τις αναφορές που διαχειρίζεται τον συλλέκτη σκουπιδιών. Μπορεί να κάνω λάθος σχετικά με αυτό το τελευταίο σημείο. Χαίρομαι που δεν γνωρίζουν τις απαντήσεις από πρώτο χέρι :), αλλά έχω παίξει με ΕΚΤΕΛΕΣΗ AS και να επανέλθει για εναλλαγή μεταξύ χρηστών


Αλλά εδώ είναι 2 καλές συνδέσεις για να αρχίσει με


Αλλαγή αποθηκευμένης διαδικασίας εκτέλεσης πλαίσιο του SQL Server με χρήση της ρήτρας Επαναφορά


Συνοπτικά: να σας χορηγήσει χρήστη να μιμηθεί όπως λένε DBA, στη συνέχεια, να επανέλθει μετά


<http://www.mssqltips.com/tip.asp?tip=1579>


Δίνοντας Δικαιώματα μέσω αποθηκευμένες διαδικασίες


Σύνοψη: Είμαι πολύ τεμπέλης για να διαβάσετε σε όλο θέμα


<http://www.sommarskog.se/grantperm.html> Εντάξει. Βρήκα αυτό είναι το πρόβλημα.


Στην αρχή νόμιζα ότι ήταν ένα πρόβλημα της DataProvided, αλλά ότι δεν ήταν. Ανακάλυψα το ίδιο θέμα σε SQLServer 2000 ....


Ψάχνοντας στο google βρήκα κάτι σχετικά με το σχέδιο εκτέλεσης. Λαμβάνοντας αυτό τον τρόπο, θα ενισχυθεί η απόδοση του ερωτήματος του 50%.


Σύντομο βιογραφικό του προβλήματος είναι ότι κατά την εκτέλεση SP με κωδικό, το ΣΔΒΔ έχει κάποιο πρόβλημα με το σχέδιο εκτέλεσης, και δεν χρησιμοποιεί τους δείκτες ...


Η καλύτερη απάντηση είναι σε αυτή τη θέση:
 [Παράμετρος Sniffing (ή πλαστογράφηση) σε SQL Server](https://stackoverflow.com/questions/211355/parameter-sniffing-or-spoofing-in-sql-server)


Ελπίζω ότι αυτό θα σας βοηθήσει. Λοιπόν, το ίδιο PowerShell δεν θα σας δώσει πολύ με τον τρόπο της επιπλέον βοήθεια. Δεν αναφέρω ποια έκδοση του SQL, γι 'αυτό θα είναι λίγο γενικό.


Πραγματικά, το μόνο που χρειάζεται να κάνετε είναι να έχετε το αρχείο script σας να αντιγράψετε τα απαραίτητα αρχεία DLL για CLR αποθηκευμένες procs σας - PowerShell να αντιγράψετε τα αρχεία σαν μανιακός, οπότε δεν υπάρχει πρόβλημα εκεί. Στη συνέχεια θα πρέπει να εκτελέσει τη δήλωση CREATE ΣΥΝΕΛΕΥΣΗ σε SQL. PowerShell εγγενώς δεν μπορεί να βοηθήσει με αυτό. Εάν χρησιμοποιείτε SQL 2008, το σενάριο σας μπορεί να Add-PSSnapin τον πάροχο SQL cmdlet, το οποίο θα σας δώσει μια cmdlet, ικανό να εκτελεί ερωτήματα SQL - έτσι ώστε να παίρνει Μπορείτε να δημιουργήσετε σας δήλωση.


Εάν δεν έχετε το 2008, θα πρέπει να γράψετε μια σύντομη ρουτίνα .NET για να δημιουργήσετε ένα SqlConnection και SqlCommand - δεν είναι δύσκολο, και εντελώς ενδεχομένως σε PowerShell.


Στη συνέχεια, χρησιμοποιούν την ίδια τεχνική για να εκτελέσει τη δήλωση CREATE PROC σας για να δημιουργήσετε πραγματικά το αποθηκευμένο proc, χρησιμοποιώντας το ως άνω διάταξη.


Zat βοήθεια; Κρίμα δεν υπάρχει τίποτα πιο αυτοματοποιημένη, αλήθεια. MS δεν έχει περάσει πολύ πνευματικού δυναμικού απλούστευση των πολύπλοκων πράγματα εγκατάσταση του SQL αυτού του είδους, δεν νομίζω, και CLR πράγματα προσθέτει λίγο επιπλέον μπαχαρικό από τη στιγμή που πρέπει να διαθέτουν το συγκρότημα. Από μερικές από την αρχική έρευνα δεν φαίνεται να είναι μια εξαιρετικά απλή λύση. 


Φαίνεται ότι το να κάνουμε αυτό συνεπάγεται με το Visual Studio 2008, στην πραγματικότητα εγκατεστημένο στο διακομιστή συνεχούς ολοκλήρωσης, η οποία θα μπορούσε να είναι ένας διακόπτης διαπραγμάτευσης.


Στη συνέχεια, να ρυθμίσετε το MSTest.exe να τρέξει στη λίστα εργασιών, αλλά πρώτα θα πρέπει να κάνει ένα αρχείο δέσμης για να διαγράψετε τα αρχεία αποτελέσματα από προηγούμενες διελεύσεις και την ύπαρξη αυτού του αρχείου προκαλεί ένα σφάλμα.


Στη συνέχεια, δημιουργήστε ένα XSLT για να μορφοποιήσετε τα αποτελέσματα και να το βάλετε στο αρχείο dashboard.config.


Το άρθρο κωδικό έργου που βρήκα έχει πολύ περισσότερες λεπτομέρειες.


[Η ενσωμάτωση Visual 2008 Δοκιμές Μονάδα Studio ομάδας συστήματος με CruiseControl.NET](http://www.codeproject.com/KB/tips/VSTS2008_Tests_With_CCNET.aspx) Σε περίπτωση που κάποιος πρέπει να κάνει το ίδιο πράγμα, έχω [ανακαλύψει ότι είναι δυνατόν με τη χρήση Servlets](https://stackoverflow.com/questions/359147/mask-urls-in-jsp) να φιλτράρετε τις διευθύνσεις URL, response.sendRedirect () και request.getRequestDispatcher (). Προς τα εμπρός (). Αυτή είναι μια πολύ καλή ερώτηση.


Νομίζω ότι είναι λεπτή, αλλά σίγουρα λογοδοτούν:


Οι μακροεντολές που δεν έχουν κολλήσει σε s-εκφράσεις. Δείτε το μακρο LOOP για μια πολύ πολύπλοκη γλώσσα γραμμένο με λέξεις-κλειδιά (σύμβολα). Έτσι, ενώ μπορεί να ξεκινήσει και να τελειώσει το βρόχο με παρενθέσεις, μέσα σε αυτό έχει τη δική του σύνταξη.


Παράδειγμα:



```
(loop for x from 0 below 100
      when (even x)
      collect x)

```

Τούτου λεχθέντος, πιο απλό μακροεντολές χρησιμοποιούν μόνο s-εκφράσεις. Και θέλετε να «κολλήσει» με τη χρήση τους.


Αλλά s-εκφράσεις, όπως Sergio έχει απαντήσει, αρχίζουν να αισθάνονται δεξιά. Η σύνταξη παίρνει έξω από το δρόμο και να ξεκινήσετε την κωδικοποίηση στο δέντρο σύνταξη.


Όσο για μακροεντολές αναγνώστη, ναι, θα μπορούσε ενδεχομένως να γράψετε κάτι σαν αυτό:



```
#R{
      ruby.code.goes.here
  }

```

Αλλά τότε θα πρέπει να γράψετε τη δική σας Ruby σύνταξη αναλυτή.


Μπορείτε, επίσης, να μιμούνται μερικές από τις Ruby κατασκευάζει, όπως τετράγωνα, με μακροεντολές που συγκεντρώνει τις υπάρχουσες Lisp κατασκευές.



```
#B(some lisp (code goes here))

```

θα μεταφραστεί σε



```
(lambda () (some lisp (code goes here)))

```

Δείτε [αυτή τη σελίδα](http://rottcodd.wordpress.com/2007/11/29/lambda-shortcut/) για το πώς να το κάνουμε. SQL Server 2000 δεν παρακολουθεί αυτές τις πληροφορίες για σας. 


Μπορεί να υπάρχουν δημιουργικοί / fuzzy τρόπους για να μαντέψετε τι αυτή η ημερομηνία αυτή ανάλογα με το μοντέλο της βάσης δεδομένων σας. Αλλά, αν μιλάμε για 1 τραπέζι χωρίς σχέση με άλλα δεδομένα, τότε είστε από την τύχη. Θα ήθελα να μείνω μακριά από αυτό. Είναι ένα πολύ κακό παράδειγμα. Δεν καταλαβαίνω γιατί η Microsoft έθεσε στο διαδίκτυο. Πρώτα απ 'όλα για τους λόγους ασφαλείας, αλλά ο κώδικας είναι πολύ δύσκολο να διαβάσει για τους νέους σχεδιαστές. Χρησιμοποιώ asp.net MVC από την προεπισκόπηση 2, αλλά είναι ακόμα πολύ δύσκολο να διαβάσει αυτόν τον κωδικό, γιατί είναι κακό. Πολλές καλύτερα παραδείγματα που βρέθηκαν ή που χρησιμοποιούνται εδώ στοίβα υπερχείλιση. Προσωπικά προτείνω να παρακολουθείτε τα screencasts στην ιστοσελίδα Rob Connery ή για [Autumnofagile](http://www.autumnofagile.net)


[Karl Seguin πήρε το χρόνο για να συνοψίσουμε](http://codebetter.com/blogs/karlseguin/archive/2008/12/15/oxite-oh-dear-lord-why.aspx)


[Rob Κόνερι εργάζεται για τη Microsoft και δεν του αρέσει, είτε](http://blog.wekeroad.com/blog/some-thoughts-on-oxite/)


[Μια νέα λέξη είναι το όνομά του, αφού: Oxitis](http://frickinsweet.com/ryanlanciaux.com/post/Do-you-have-this-condition.aspx)