2013 m. gruodžio 31 d., antradienis

LINQ: sum columns without grouping


I think the title speaks for itself. I want to create a LINQ query with aggregations on multiple columns where no grouping is applied. This is just something that can be done very simple in plain SQL.
1 SELECT 2 MAX(HorsePower), 3 AVG(Weight) 4 FROM 5 Car
But when you want to create a construction that's similar in LINQ you will get an compilation error, because of a wrong syntax.
1 var result = from car in sut.Cars 2 select new 3 { 4 MaxHorsePower = car.Max(p => p.HorsePower), 5 AverageWeight = car.Average(p => p.Weight) 6 };
The trouble is that this doesn't work. You can do an aggregation on an complete set, like the following. This will result in just two queries.
1 var result2 = (from car in sut.Cars select car.HorsePower).Max(); 2 var result3 = (from car in sut.Cars select car.Weight).Average();
You can actually do multiple aggregations at once when using groups. The sad thing is, we don't always have something to group on. But that can be solved.
1 var result = (from car in 2 (from car in sut.Cars 3 select new 4 { 5 car.HorsePower, 6 car.Weight, 7 Dummy = string.Empty 8 }) 9 group car by new {car.Dummy} 10 into dummyGroup 11 select new 12 { 13 MaxHorsePower = dummyGroup.Max(p => p.HorsePower), 14 AverageWeight = dummyGroup.Average(p => p.Weight) 15 }).Single();
This solution adds a dummy column called 'Dummy' with the same value for every record. Because this value is the same for every record we can safely group on it and expect to have only one group. This solution makes sure we have one query for the database, but with the use of a workaround.
I would say yes this works, but for readability I would not suggest the use of this workaround for the trivial problem above. By using two queries we have a very manageable solution that's readable from code. The workaround needs at least some comments before we can totally understand it as someone new to the workaround.

But it in the end we can also say, we now know how we can fake the grouping. Use it with care, as I mentioned because of the manageability of your code.
http://mark.mymonster.nl/2008/10/22/linq-to-sql-aggregations-on-multiple-columns-without-any-grouping

2013 m. gruodžio 2 d., pirmadienis

LINQ: ANY, NOT, JOIN use example

1. Ištraukia visus įrašus, kur OrdNo_ProdCodes turi įrašų lentelėje Records 

objs = From no In odb.OrdNo_ProdCodes
                   Join r In odb.Records On r.Ord_Prod_ID Equals no.ID
                   Select no
                   Distinct


2. Ištraukia  tik tuos įrašus iš OrdNo_ProdCodes, kurie neturi įrašų lentelėje Records

 objs = From no In odb.OrdNo_ProdCodes
                  Where Not no.Records.Any()
                  Select no
                  Distinct





         

2013 m. lapkričio 12 d., antradienis

Error: 'Type' is undefined

oWindow.currCallback = Type.createCallback(refreshRows, { iTRID: iTrID, oTR: oTR });

Klaida: Error: 'Type' is undefined

Sprendimas: puslapyje reikia įdėti ScriptManager

2013 m. lapkričio 11 d., pirmadienis

2013 m. spalio 11 d., penktadienis

Fiunction find difference betwen two dates

 function calcDiff(date1, date2) {
            //Get 1 day in milliseconds
            var one_day = 1000 * 60 * 60 * 24;

            // Convert both dates to milliseconds
            var date1_ms = date1.getTime();
            var date2_ms = date2.getTime();

            // Calculate the difference in milliseconds
            var difference_ms = date2_ms - date1_ms;
            //take out milliseconds
            difference_ms = difference_ms / 1000;
            var seconds = Math.floor(difference_ms % 60);
            difference_ms = difference_ms / 60;
            var minutes = Math.floor(difference_ms % 60);
            difference_ms = difference_ms / 60;
            var hours = Math.floor(difference_ms % 24);
            var days = Math.floor(difference_ms / 24);

            return minutes + ' minutes, and ' + seconds + ' seconds';
        };

2013 m. spalio 10 d., ketvirtadienis

Function format file size

Public Shared Function FormatFileSize(ByVal FileSizeBytes As Long) As String
        Dim sizeTypes() As String = {"b", "Kb", "Mb", "Gb"}
        Dim Len As Decimal = FileSizeBytes
        Dim sizeType As Integer = 0
        Do While Len > 1024
            Len = Decimal.Round(Len / 1024, 2)
            sizeType += 1
            If sizeType >= sizeTypes.Length - 1 Then Exit Do
        Loop

        Dim Resp As String = Len.ToString & " " & sizeTypes(sizeType)
        Return Resp
    End Function

2013 m. spalio 7 d., pirmadienis

Tipų konvertavimas: ToBase64String

Modern applications increasingly use plain text to store and share data, especially in XML and SOAP formats. However, binary data cannot be represented directly in plain text, so one popular method is to convert binary to Base64 format.

What is Base64?

Base64 converts binary data to plain text using 64 case-sensitive, printable ASCII characters: A-Z, a-z, 0-9, plus sign (+) and forward slash (/), and may be terminated with 0-2 “padding” characters represented by the equal sign (=). For example, the eight-byte binary data in hex “35 71 4d 8e 4c 5f db 42″ converts to Base64 text as “NXFNjkxf20I=”.

.NET Convert Methods

Generally, to convert between Base64 and plain text, you should use the .NET methods Convert.ToBase64String and Convert.FromBase64String.

Custom Conversions


However, there may be instances when you want to modify the Base64 standard conversion behavior. For example, applications may use Base64 in file paths or URLs to represent globally unique IDs and other binary data. However, the forward slash is an invalid character in file paths. In URLs, the ‘+’ and ‘/’ characters translate into special percent-encoded hexadecimal sequences (‘+’ = ‘%2B’ and ‘/’ = ‘%2F’), and databases may choke on the % character because it represents a wildcard in ANSI SQL. Therefore, a modified “Base64 for URL” variant exists, where no ‘=’ padding is used, and the ‘+’ and ‘/’ characters are replaced with the hyphen ‘-’ and underscore ‘_’, respectively.


Function getBase64Text(ByVal sInput As String) As String
        Return System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(sInput))
    End Function

http://www.csharp411.com/convert-binary-to-base64-string/

2013 m. spalio 3 d., ketvirtadienis

Mod and division in Visual Basic

Dim hrs As Integer = allmins \ 60
Dim minutes As Integer = allmins Mod 60

Related operators include the following:

2013 m. rugsėjo 25 d., trečiadienis

AsyncPostBackTrigger nenaudoti su Response.Write

Dideliuose projektuose, kur daug JavaScript bibliotekų ir UpdatePanel, gaunama "mistinė" klaida dėl to, kad vb kode buvo panaudotas Response.Write

2013 m. rugsėjo 19 d., ketvirtadienis

Unikalių ID generavimas GridView eilutėms

 < asp : GridView ID =" grdTest " runat = " server " AutoGenerateColumns = " False " ClientIDMode = " AutoID "
            DataKeyNames = " ID ">
< / asp : GridView >


Jeigu GridView nurodome ClientIDMode, tai dar nereiškia, kad kiekvienai eilutei bus sugeneruotas unikalus ID. Jis generuojamas tik tada, jei RowDataBound įvykyje kviečiame e.Row.ClientID.

 Protected Sub grdTest_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grdTest.RowDataBound

        If e.Row.RowType = DataControlRowType.Header Then
            hlDuplicate.NavigateUrl = "javascript:duplRow(" & oRW("ID") & ",'" & e.Row.ClientID & "')"
        End If

End If

2013 m. rugsėjo 17 d., antradienis

Kaip konvertuoti vieną stulpelio tipą į kitą tipą


ALTER TABLE table_name ADD new_column_name decimal(18,2)

update table_name
set new_column_name = convert(decimal(18,2), old_column_name)

ALTER TABLE table_name DROP COLUMN old_column_name

decimal(4,1) vs. decimal(4,2)

(4,1): 4 - kiek pozicijų iš viso, 1- kiek pozicijų iš jų skirta po kablelio. t.y. max skaičius 999,9.  (4,2): max skaičius 99,99

Disable Browser Back Button Using JavaScript ASP.NET

Sprendimas:

JavaScript:

function disableBackButton()
{
window.history.forward();
}
setTimeout("disableBackButton()", 0);
< body   onunload=" disableBackButton() " >

http://www.codeproject.com/Questions/89384/Disable-Browser-Back-Button-Using-Javascript-ASP-N.aspx

2013 m. rugsėjo 12 d., ketvirtadienis

Datos formatas pagal lokalią kalbą JavaScript ir ASP.NET

Problema: atnaujinant duomenis su JavaScript, dažnai reikia išlaikyti datos formatą pagal lokalią kalbą.

Sprendimas:

var d = new Date(MeetDate).localeFormat("d"); - JavaScript

< % #  Eval("MeetDate", " { 0 : d } ") % > - ASP.NET

Daugiau: http://www.asp.net/AJAX/Documentation/Live/ClientReference/Global/JavascriptTypeExtensions/DateTypeExt/default.aspx

In Chapter 6: ASP.NET AJAX Localization, on page 289, we have a tip on Data Format Strings. It states that “the data format strings available for the Date and Number types in JavaScript are the same as those that are available in .NET for the DateTime and Double types.” This is incorrect.
The format strings that are allowed for Number types are the following:
  • c or C: Currency
  • p or P: Percentage
  • d or D“: Decimal (# number of digits)
  • n or N“: Numeric (# number of digits after decimal)
- e, f, g, r, x, and custom format strings are not supported
The standard format strings that are allowed for the Date type are the following:
  • d: Short date pattern
  • D: Long date pattern
  • t: Short time pattern
  • T: Long time pattern
  • F: Full date/time pattern (long time)
  • m or M: Month day pattern
  • s: Sortable date/time pattern
  • y or Y: Year month pattern
- the standard format strings: f, F, g, G, O, o, R, r, u, U are not supported. However, custom format strings that use the “mmm”, “yyyy”, “hh”, etc. formats are supported. You can build your own date format string.

http://seejoelprogram.wordpress.com/2008/08/07/supported-number-and-datetime-format-strings-in-aspnet-ajax/




Kaip iš DateTime gauti datos formatą JavaScript'e:

DateAdded: (new Date(parseFloat(result.d[i].auditdate.slice(6, 19)))).localeFormat("d")

čia 6,19 iš DateTime formato nuima pradžią ir pabaigą.

2013 m. rugsėjo 11 d., trečiadienis

JQuery UI: Dialog savybė AppendTo

Problema: sukūrėme dialogo langą su JQuery dialog. Dialogo lange yra checkbox. Pakeitus checkbox reikšmę, langas užsidaro ir visas puslapis persikrauna.

Sprendimas: naudoti appendTo savybę. Tam reikia visą HTML kodą, kuriame aprašytas dialogas, įdėti į papildomą div elementą ir to div ID nurodyti AppendTo.

JQuery:

 $(document).ready(function () {

            $("#dvOrder").dialog({
                appendTo: "#dvContainer",
                autoOpen: false,
                modal: true,
                width: 800,
                height: 320,
                resizable: false,
                title: "Užsakymo patvirtinimas",
                buttons: [
                    {
                        text: "Tvirtinti",
                        click: function () {
                            SSService.ConfirmOrder(document.getElementById("txtDate").value, document.getElementById("ddlHours").value, document.getElementById("ddlMin").value, document.getElementById("tbPlaceFrom").value, document.getElementById("tbPlaceTo").value, document.getElementById("tbNameSurname").value, $('#cbMeet').val(),$('#tbInfo').val(), $('#tbInfo2').val(), document.getElementById("hfOrderID").value, function (result) {
                                if (result) {

                                    var rowID = document.getElementById("hfrowID").value

                                    if (rowID != "") {
                                        var oTR = $("#" + rowID).get(0);
                                        oTR.cells[0].innerText = "";
                                        if ((result.MeetDate + " " + result.MDHours + " : " + result.MDMin).trim != ":") {
                                            oTR.cells[2].innerText = result.MeetDate + " " + result.MDHours + " : " + result.MDMin;
                                        };
                                        oTR.cells[3].innerText = result.MeetFrom;
                                        oTR.cells[4].innerText = result.MeetTo;
                                        oTR.cells[5].innerText = result.NameSurname;
                                        oTR.cells[6].innerText = result.MeetInAirport;
                                        oTR.cells[7].innerText = result.FlightFrom;
                                        oTR.cells[8].innerText = result.Note;
                                        oTR.cells[10].innerText = result.Status;
                                        oTR.cells[11].innerText = result.TaxiOrderNo;
                                    };
                                };
                            });


                            $(this).dialog("close");
                        }
                    },
                    {
                        text: "Atmesti",
                        click: function () {

                         //kodas
                        }
                    }
                ],
                open: function () {
                    document.getElementById("tbPlaceFrom").focus();
                }
            });

         

        });


HTML kodas:
< div id = "dvContainer" >
        < div id="dvOrder" style="display: none" >
         
        < / div >
  < / div >
       

2013 m. rugsėjo 10 d., antradienis

CustomValidator pavyzdys su VB ASP.NET

Užduotis: jeigu CheckBox pažymėtas varnele, privaloma užpildyti dar du laukus: tbInfo ir tbInfo2


                             
ID="cvMeet" runat="server"
ErrorMessage="Privalomas"
OnServerValidate="cvMeet_ServerValidate"
ValidateEmptyText="True"
ClientValidationFunction="validateTaxiOrderForm" ForeColor="Red">


JavaScript:

function validateTaxiOrderForm ( source, args) {
            if ($("#cbMeet").val() == "checked"
                && $("#tbInfo").val() == ""
               && $.trim($("#tbInfo2").val()) == "") {

                args.IsValid = false;
            } else {
                args.IsValid = true;
                window.returnValue = true;
            };

        };

VB:
Protected Sub cvMeet_ServerValidate(source As Object, args As ServerValidateEventArgs) Handles cvMeet.ServerValidate
        If cbMeet.Checked = True Then
            Validate("meet")
            If Not IsValid Then
                Return
            End If
        End If
    End Sub

Client-side valdidavimą galima išjungti su savybe EnableClientScript=false

2013 m. rugpjūčio 23 d., penktadienis

Understanding RegisterClientScriptBlock and RegisterStartupScript

RegisterClientScriptBlock - įterpia javascript tekstą prieš formuojant HTML(nenaudojamas dirbant su UpdatePanel, nes scriptų neužregistruoja).

RegisterStartupScript - įterpia javascript tekstą jau suformavus HTML elementus (naudojama inicializacijai ir dirbant su UpdatePanel).

Partial Class Default2
    Inherits System.Web.UI.Page

    Protected Sub Page_PreRender(sender As Object, e As EventArgs) Handles Me.PreRender
        Dim sScript As String = "" &
            "function checkBox() {" &
            "   if (document.getElementById('" + TextBox1.ClientID + "').value != 'OK') {alert('Wrong'); return false} else {return true};" &
            "};"
        ScriptManager.RegisterClientScriptBlock(Me, Me.GetType, "tt", sScript, True)

        Button1.Attributes.Add("onclick", "return checkBox();") - užregistruoja, kada turi būti iškviečiama javascript funkcija

        ScriptManager.RegisterStartupScript(Me, Me.GetType(), "ttt", "document.getElementById('" + TextBox1.ClientID + "').value = '" & Now().ToString() & "';", True)
    End Sub

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Literal1.Text = Now()
    End Sub
End Class

Pagal tokį kodą, HTML suformuojamas taip:


2013 m. rugpjūčio 18 d., sekmadienis

How to call web service synchronously with JavaSript in ASP.NET

 function gvUpdateHeader(sUserLang) {
            var gv = document.getElementById("gvsummary");

            if (gv != null) {
             
                var strid = 2;

                for (var i = 1; i < gv.rows[0].cells.length; i++) {
                    getStringByLang(sUserLang, strid, i, gv);
                    strid++;
                }

            };

        };

        function getStringByLang(sUserLang, strid, i, gv) {

            VIService.GetString(sUserLang, strid, function (result) {
                if (result) {

                    gv.rows[0].cells[i].innerHTML = result;
                };
            });
        }

2013 m. liepos 18 d., ketvirtadienis

CalendarExtender using JQuery

Problema: per JQuery CalendarExtender priskirti datos reikšmę taip, kad ir TextBox'e, ir kalendoriuje matytųsi teisinga data.

Sprendimas: Firstly you need to ensure that the Calendar Extender, as seen below in Figure 1, has a BehaviorID value set.





< asp : TextBox ID="dateLastCheckedTextBox" runat="server" CssClass="textBox" / >

< asp : CalendarExtender id="dateLastCheckedCalendarExtender" BehaviorID="dateLastCheckedCalendarExtender" runat="server" TargetControlID="dateLastCheckedTextBox" Format="dd/mm/yyyy" EnabledOnClient="true" OnClientShown="checkDate" / >


  Then, assign the OnClientShown event of the CalendarExtender to the checkDate function shown below, setting the date using the set_selectedDate accessor.  

    function checkDate(sender, args) {


var currentDate = $("input[id$='dateLastCheckedTextBox']:visible").val();

var calendarBehavior = $find("dateLastCheckedCalendarExtender");

calendarBehavior.set_selectedDate(getDateFromUkDateString(currentDate));

}

function getDateFromUkDateString(dateStr) {

dateStr = dateStr.split("/");

if (dateStr.length == 1)

return null;

else

return new Date(dateStr[2], dateStr[1] – 1, dateStr[0]);

}  

http://gordonduthie.net/2010/04/14/setting-the-value-of-a-calendarextender-using-jquery/

2013 m. liepos 5 d., penktadienis

'System.Void' is not a valid return type for a mapped stored procedure method.


Iškviečiant stored procedūrą per LINQ gaunama klaida: 'System.Void' is not a valid return type for a mapped stored procedure method.

Sprendimas: Nurodyti return tipą - Integer.



2013 m. birželio 3 d., pirmadienis

LINQ: CaseInsensitiveComparer

Dim objlog = (From e In oDB.Employees Where CaseInsensitiveComparer.Equals(e.Login, txtLogin.Text.Trim)

LINQ property ReadOnly

Norint atnaujinti laukus, būtina išsiselectinti visą objektą, o ne kelias properties:

Dim objUsrThis = (From e In oDB.Employees Where e.Id = currEmpID).FirstOrDefault


objUsrThis.Login = txtLogin.Text.Trim

oDB.SubmitChanges()

2013 m. balandžio 26 d., penktadienis

2013 m. balandžio 20 d., šeštadienis

Login 2013

Visi pokyčiai gyvenime vyksta dėl to, kad žmonės nori patogesnio gyvenimo.

Kaip sakė pranešėjas apie strateginį planavimą Naoh Raford (http://www.login.lt/konferencija/pranesejai?id=30), į priekį gali eiti tik tie, kurie nebijo. Nebijo pokyčių, eksperimentų, yra entuziatingi, kaip kad BeatJazz atlikėjas (http://www.login.lt/konferencija/pranesejai?id=65):



Šiame video Onyx groja savo sukurtais instrumentais, kurie fiksuoja kiekvieną žmogaus judesį, kiekvieną įkvėpimą ir iškvėpimą bei šią informaciją paverčia į muzikos garsus. Tokie žmonės vadinami XXI amžiaus herojais. Taigi, mes galime rinktis, kurioje pusėje norime būti: baimės ar entuziazmo.

Aqua Lingua (lot. vanduo, kalba) - tai žmogaus balso, muzikos ar kito garso sukurti paveikslai, nematomų, bet girdimų bangų vizualizavimas vandenyje (http://aqualingua.org).

Visi mes klystame. Vieni daugiau, kiti - visą laiką. Džeimsas Raselas Lovelis


Neteisk ir nebūsi teisiamas. Šventasis Raštas

Laikas "protingiems" namams (http://www.login.lt/konferencija/pranesejai?id=175). „Ne įrenginių gausa nulems mūsų gerą ateitį, o mūsų gyvenimo būdas. Jis yra ir bus linkęs į „smart“ (liet. protingas – red. pastaba)“ - teigia pranešėjas. Dauguma smart įrenginių nukreipta moters išlaisvinimui nuo buities. Jau pirmosios reklamos buvo orientuotos į moteris.

Protingą namą galima valdyti plančetėmis, telefonais, televizoriumi ir net kūno judesiais. Galima kontroliuoti šildymą, apšvietimą, kiemo laistymą, varveklių tirpinimą.

Anot jo, speciali technika gali padėti daryti namų apskaitą, reguliuoti elektros, vandens suvartojimą. Ryte, nustatytu laiku, jus gali pažadinti maloni muzika ar šviesa pro langą, kur ką tik buvo praskleistos užuolaidos. Virtuvėje rasite jau garuojančią kavą, vonioje – įšilusias grindis.

„Išeidami iš namų galite nustatyti tuščių namų rėžimą: išsijungs elektroniniai prietaisai, vandens ir dujų tiekimas. Įvykus avarijai ar nelaimei automatiškai bus iškviesta reikalinga pagalba. Jeigu vėluosite grįžti į namus, nuotoliniu būdu bus pašertas net jūsų augintinis“, – „protingojo“ namo privalumus vardijo K. Šišla.



http://www.manonamai.lt/mano-namai/namai/login-2013-protingi-namai-suteiks-galimybe-nuotoliniu-budu-issivirti-kavos.d?id=61185757

http://verslas.delfi.lt/nekilnojamas-turtas/gyvenimas-protingame-name-suo-seriamas-internetu-zole-pasilaisto-pati.d?id=61247133

AdBox - reklamos galimybė smulkiajam verslui (http://www.adbox.lt/lt/titulinis/). Statistiškai smulkusis verslas žlunga per 3 metus, jeigu nesinaudojama reklamos paslaugomis (http://www.login.lt/konferencija/pranesejai?id=122).

"Li-Fi" - technologija, leidžianti perduoti duomenis šviesos pagalba (http://www.login.lt/konferencija/pranesejai?id=28).



http://www.ted.com/talks/harald_haas_wireless_data_from_every_light_bulb.html


Kitos nuorodos: NaohRaford tinklaraštis http://news.noahraford.com/

S. Wozniakas "Sunkus darbas talento neužgožia, sunkus darbas talentą tik palaiko". Viską, ką darė, darė tikėdamas idėja.:  http://mokslas.delfi.lt/login/s-wozniakas-savo-vaika-i-universiteta-siustu-lietuviu-kalbos-atpazinimui-kurti.d?id=61194479#

Apie e-valdžią, vieningą sistemą Gruzijoje: http://mokslas.delfi.lt/login/login-2013-kaip-technologijomis-israuti-korupcijos-piktzole.d?id=61189141, http://www.login.lt/konferencija/pranesejai?id=189

http://mokslas.delfi.lt/login/login-2013-kviecia-lietuvius-i-pirma-kolonija-marse.d?id=61191295

http://mokslas.delfi.lt/login/

2013 m. balandžio 4 d., ketvirtadienis

Drop column from replicated table

Naudojame sp_repldropcolumn:

sp_repldropcolumn 'TableName', 'ColumnName' 

http://technet.microsoft.com/en-us/library/ms190489.aspx

2013 m. vasario 16 d., šeštadienis

Collation types

SQL Serveris turi dviejų tipų collations: Windows collations and SQL Server collations.

BIN2 sorts and compares data in Microsoft SQL Server tables based on Unicode code points for Unicode data. For non-Unicode data, binary-code point uses comparisons that are identical to binary sorts. The advantage of using a binary-code point sort order is that no data re-sorting is required in applications that compare sorted SQL Server data. As a result, a binary-code point sort order provides simpler application development and possible performance benefits.

BIN_CS sorts and compares data in SQL Server tables based on the bit patterns defined for each character, however re-sorting is required on the application end.

CI_AS_KS and CI_AI do not provide automatic sorting on the application end.

http://msdn.microsoft.com/en-us/library/ms175194%28v=sql.105%29.aspx

http://msdn.microsoft.com/en-us/library/ms143515%28v=sql.105%29.aspx - Collation sorting styles

Pvz., jeigu buvo pakeista duomenų bazės collation, tada papildomai reikia perkurti visus ryšius ir indeksus, atitinkamai, jeigu keitėsi stulpelių collation.

Changing the collation at the column level requires some work, particularly if the tables have indexes and other constraints defined. If indexes and other constraints exist on the target column, those objects must be dropped before changing either the collation property or the data type.

Dropping indexes and constraints of pre-existing tables, changing column collation, and implementing required indexes and constraints again is the correct choice.

Dropping indexes and constraints of the preexisting tables where collation needs to be changed does not implement any change to the collation of data.

Auto-indexing is not an option.

Norint padaryti JOIN tarp dviejų lenetelių, reikia kad abu stulpeliai turėtų tą patį collation.

To make a join, the collation and data types of both columns should match.

The JOIN clause in

EUROPE  INNER JOIN US ON EUROPEREVENUE.ProductType = USREVENUE.USProductType COLLATE Greek_CI_AS

has the same column name, the same collation, and the same data types on both columns used for the join.

NOEXPAND

NOEXPAND  - naudojamas indeksuotuose viewuose, užtikrinti, kad vykdant užklausą bus lengvai prieinamos viewui reikalingos lentelės.

For the query optimizer to consider indexed views for matching or use an indexed view that is referenced with the NOEXPAND  hint, the following SET  options must be set to ON:

 * ANSI_NULLS
 * ANSI_PADDING
 * ANSI_WARNINGS
 * ARITHABORT
 * CONCAT_NULL_YIELDS_NULL
 * QUOTED_IDENTIFIERS

The NUMERIC_ROUNDABORT  option must be set to OFF.

Ranking functions

NTILE - atrinktas eilutes išskirto į grupes

DENSE_RANK - grąžina rinkinį eilučių be tarpo rikiavime. Jei bus dvi lygiavertės eilutės, tai rikiavimo rezultatas būtų toks: 1, 1, 2, 3...

ROW_NUMBER - grąžina tiesiog išrikiuotas eilutes

RANK - jeigu bus dvi lygiavertės eilutės, jos gaus tą patį numerį, bet atitinkamai atsiras tarpai rikiavime (pvz. bus dvi eilutės su numeriu 1, tai rikiavimo rezultatai: 1, 1, 3)

http://msdn.microsoft.com/en-us/library/ms189798.aspx

CTE



CTE – pirmiausia atsirado Server 2005.



WITH < CTE name > [  ( < column name > [ ,...n ]  )  ]
AS
(  < query returning tabular data >  )
< statement that will make use of the CTE >


CTE negali būti naudojami:

COMPUTER and COMPUTE BY
ORDER BY
INTO
The FOR XML, FOR BROWSE, and OPTION query clauses

CTE nekontroliuoja, kokia infomacija grąžinama – į ją tik sudedama informacija. Norint kontroliuoti, ką grąžiname, rašome atskirą SELECT’ą iš CTE ir išvedame kokius norime stulpelius, rikiuojame pagal poreikį.

Pavydžiui, jeigu turime lentelę Employees, kurioje yra du stulpeliai:

empName,
department 

Reikia išvesti empName, department tik tų skyrių, kuriuose daugiau nei 10 darbuotojų. Su CTE tai padaryti lengviau - reikės mažiau resursų:

WITH DepCounts (department, employees)
AS ( SELECT department, COUNT(*)
        FROM Employees
        GROUP BY department)
SELECT e.empName, e.department, d.employees
    FROM Employees AS e
    JOIN DepCounts AS d ON e.department = d.department
    WHERE d.employees > 10;

Tą patį galime padaryti su laikina lentele, bet reikės daugiau resursų:

SELECT empName, department,
    (SELECT COUNT(*) FROM Employees WHERE department = e.department)
    FROM Employees AS e
    WHERE 1 < (SELECT COUNT(*) FROM Employees
        WHERE department = e.department);


CTE naudojamas kas kart, kai vykdoma užklausa. Jeigu bus vykdoma daug SELCT ar INSERT operacijų - geriau naudoti laikinąsias lenteles.