SelectEtoile : Base de connaissance SGBD

Posts Tagged 'sqlserver'

Présentation du site

 
Ce site a été développé afin de fournir des explications, documentations et astuces en tout genre concernant les bases de données.Ils proviennent de retour d'expériences de différents DBA.
Il est à noter que ces articles ne sont que des notes et en aucune façon des documentations officielles.
Ce site peut contenir des commandes non supportées par les différents éditeurs qui sont à utiliser avec précaution.
Bien sur, si vous constatez des erreurs ou avez des remarques sur un ou plusieurs articles, n'hésitez pas à nous en faire part, soit via l'onglet Contacts, soit via les commentaires à votre disposition à la fin de chaque article.
 
Pour ceux qui seraient intéressés pour écrire ou proposer des articles, n'hésitez pas à me contacter via 'Contacts' dans le menu du haut.
flux_rssInscrivez vous au fil d'actualité selectetoile.net flux_rss

SQLServer - Créer un package SQLServer 2008 SP3 à partir d'un SQLServer 2008 SP1 ou SP2

Télécharger les fichiers du SP3 :

Pour la démonstration, je vais les mettre dans D:\install\Microsoft\SQL Server 2008\SP\SP3

Il s'agit des fichiers :

  • SQLServer2008SP3-KB2546951-IA64-ENU.exe
  • SQLServer2008SP3-KB2546951-x64-ENU.exe
  • SQLServer2008SP3-KB2546951-x86-ENU.exe

 

Copier le répertoire à patcher vers la cible :

Sous DOS, lancer :

  • d:
  • cd D:\install\Microsoft\SQL Server 2008\
  • mkdir ENT_SP3
  • cd ENT_SP3
  • xcopy "D:\install\Microsoft\SQL Server 2008\ENT_SP2" /E

 

Extraire les fichiers SP3*.exe vers D:\install\Microsoft\SQL Server 2008\SP\PCU_SP3

Sous DOS, lancer :

  • SQLServer2008SP3-KB2546951-x64-ENU.exe /x:"D:\install\Microsoft\SQL Server 2008\SP\PCU_SP3"
  • SQLServer2008SP3-KB2546951-x86-ENU.exe /x:"D:\install\Microsoft\SQL Server 2008\SP\PCU_SP3"

 

Copier les fichiers Setup.exe et Setup.rll de PCU_SP3 à ENT_SP3

  • robocopy "D:\install\Microsoft\SQL Server 2008\SP\PCU_SP3" "D:\install\Microsoft\SQL Server 2008\ENT_SP3" Setup.exe
  • robocopy "D:\install\Microsoft\SQL Server 2008\SP\PCU_SP3" "D:\install\Microsoft\SQL Server 2008\ENT_SP3" Setup.rll

 

Copier tous les fichiers (pas les répertoires) , sauf Microsoft.SQL.Chainer.PackageData.dll, de "D:\install\Microsoft\SQL Server 2008\SP\PCU_SP3" vers "D:\install\Microsoft\SQL Server 2008\ENT_SP3"

  • robocopy "D:\install\Microsoft\SQL Server 2008\SP\PCU_SP3\x86" "D:\install\Microsoft\SQL Server 2008\ENT_SP3\x86" /XF Microsoft.SQL.Chainer.PackageData.dll
  • robocopy "D:\install\Microsoft\SQL Server 2008\SP\PCU_SP3\x64" "D:\install\Microsoft\SQL Server 2008\ENT_SP3\x64" /XF Microsoft.SQL.Chainer.PackageData.dll

 

Vérification du fichier DefaultSetup.ini dans les répertoires :

  • D:\install\Microsoft\SQL Server 2008\ENT_SP3\x86
  • D:\install\Microsoft\SQL Server 2008\ENT_SP3\x64
  • D:\install\Microsoft\SQL Server 2008\ENT_SP3\IA64

Il faut préciser la variable PCUSOURCE, comme sous l'exemple suivant :

PCUSOURCE="\\mamachine\install\Microsoft\sql server 2008\SP\PCU_SP3"

Il reste plus qu'à lancer le setup.exe et croiser les doigts ; )))

Lecture des deadlock en mode graphique sous SQLServer

Le script ci-dessous permet de lister les deadlocks survenus sur une instance (2008 et plus) et d'afficher le deadlock choisi en mode graphique.

 

param
(
    [string]$FullInstanceName,
    [string]$sourceXMLFile
)

if (!$FullInstanceName){
    "Usage : "
    "        FullInstanceName     : Mandatory. Full Name of MSSQL Server (ex hostname\mssqlservername)"
    "        sourceXMLFile         : XML Full File Name (ex : c:\temp\Deadlock.xml)"
    ""
    "ex :"
    "        ./readDeadlock.ps1 -FullInstanceName "
    ""
    exit 2
}

## Functions

function chooseDateCollect {
Param ($CreationDateArray)
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | out-null

$Form = New-Object System.Windows.Forms.Form
$Form.width = 500
$Form.height = 110
$Form.Text = "Choose the date of a deadlock :"

$DropDown = new-object System.Windows.Forms.ComboBox
$DropDown.Location = new-object System.Drawing.Size(100,10)
$DropDown.Size = new-object System.Drawing.Size(320,30)
ForEach ($Item in $CreationDateArray) {$DropDown.Items.Add($Item) | out-null}

$Form.Controls.Add($DropDown)  | out-null

$Form.KeyPreview = $True
$Form.Add_KeyDown({if ($_.KeyCode -eq "Enter") {$global:DateCollect=$DropDown.SelectedItem.ToString();Write-Host $DateCollect;$Form.Close()}})
$Form.Add_KeyDown({if ($_.KeyCode -eq "Escape") {$Form.Close()}})

$DropDownLabel = new-object System.Windows.Forms.Label
$DropDownLabel.Location = new-object System.Drawing.Size(50,12)
$DropDownLabel.size = new-object System.Drawing.Size(100,20)
$DropDownLabel.Text = "DateCollect"
$Form.Controls.Add($DropDownLabel) | out-null

$Button = new-object System.Windows.Forms.Button
$Button.Location = new-object System.Drawing.Size(225,50)
$Button.Size = new-object System.Drawing.Size(50,20)
$Button.Text = "OK"
$Button.Add_Click({$global:DateCollect = $DropDown.SelectedItem.ToString();$Form.Close() | out-null;Write-Host $DateCollect})
$form.Controls.Add($Button) | out-null

$Form.Add_Shown({$Form.Activate()})
$Form.ShowDialog()

}



# Function to set sql environment
function setSQL()
{
    if ( Get-PSSnapin -Registered | where {$_.name -eq 'SqlServerProviderSnapin100'} )
    {
        if( !(Get-PSSnapin | where {$_.name -eq 'SqlServerProviderSnapin100'}))
        {Add-PSSnapin SqlServerProviderSnapin100 | Out-Null} ;
        if( !(Get-PSSnapin | where {$_.name -eq 'SqlServerCmdletSnapin100'}))
        {Add-PSSnapin SqlServerCmdletSnapin100 | Out-Null}
    }
    else
    {
        if( !(Get-Module | where {$_.name -eq 'sqlps'}))
        {$env:PSModulePath = $env:PSModulePath + ";C:\Program Files (x86)\Microsoft SQL Server\110\Tools\PowerShell\Modules"
        Import-Module 'sqlps' –DisableNameChecking}
    }
}


## Main

setSQL

#$FullInstanceName="mscsinap02\msparinap02"
$FullInstanceName2=$FullInstanceName -replace "\\", "_"

if (! $sourceXMLFile){
    [string]$sourceXMLFile="c:\temp\DeadLock_"+$FullInstanceName2+".xml"

    $CreationDateArray = @(Invoke-Sqlcmd -Query "select CONVERT(nvarchar(30), XEventData.XEvent.value('@timestamp', 'datetime'), 126) as Creation_Date
    FROM
    (select CAST(target_data as xml) as TargetData
    from sys.dm_xe_session_targets st
    join sys.dm_xe_sessions s on s.address = st.event_session_address
    where name = 'system_health') AS Data
    CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS XEventData (XEvent)
    where XEventData.XEvent.value('@name', 'varchar(max)') = 'xml_deadlock_report'" -Serverinstance $FullInstanceName -outputsqlerrors $true -ErrorAction Stop -QueryTimeout 20000) | select-object -expand Creation_Date

    chooseDateCollect -CreationDateArray $CreationDateArray
    $DateCollect

    (Invoke-Sqlcmd -Query "select T.Creation_Date,T.DeadlockGraph
from (select XEventData.XEvent.value('@timestamp', 'datetime') as Creation_Date,
CONVERT(nvarchar(30), XEventData.XEvent.value('@timestamp', 'datetime'), 126) AS UsingConvertTo_ISO8601,
CAST(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)') AS XML) as DeadlockGraph
FROM
(select CAST(target_data as xml) as TargetData
from sys.dm_xe_session_targets st
join sys.dm_xe_sessions s on s.address = st.event_session_address
where name = 'system_health') AS Data
CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS XEventData (XEvent)
where XEventData.XEvent.value('@name', 'varchar(4000)') = 'xml_deadlock_report') T
where T.Creation_Date = '$DateCollect'" -Serverinstance $FullInstanceName  -MaxCharLength 6000 -outputsqlerrors $true -ErrorAction Stop -QueryTimeout 20000).DeadlockGraph | out-file $sourceXMLFile
} else {
    "file XML : $sourceXMLFile"
}


# Convert XML File to XDL File (to open it with SSMS)
[Reflection.Assembly]::LoadWithPartialName("System.Xml")
[Reflection.Assembly]::LoadWithPartialName("System.Xml.Xsl")
[Reflection.Assembly]::LoadWithPartialName("System.IO")
[Reflection.Assembly]::LoadWithPartialName("System.IO.Path")
# Load in our transform
$xslTransform = [System.Xml.Xsl.XslCompiledTransform](new-object System.Xml.Xsl.XslCompiledTransform);
$xslTransform.Load("c:\Tools\admin\scripts\transform.xslt");
# Load in the xml produced by the extended event
$dom = [System.Xml.XmlDocument](new-object System.Xml.XmlDocument);
$dom.Load($sourceXMLFile);
# Transform the xml into the profiler format
$results = [System.IO.StringWriter](new-object System.IO.StringWriter);   
$XSLArg = New-Object System.Xml.Xsl.XsltArgumentList
$xslTransform.Transform($dom, $XSLArg, $results)
$xml = $results.ToString();
# write the amended xml out to a new file
$domNew = [System.Xml.XmlDocument](new-object System.Xml.XmlDocument);
$domNew.LoadXml($xml)
$newFilename = [System.IO.Path]::ChangeExtension($sourceXMLFile, "xdl")
$domNew.Save($newFilename);

# Run SSMS with rdl file to show deadlock graph
ssms.exe $newFilename

 

 

Fichier transform.xslt :

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <deadlock-list>
      <deadlock>
        <xsl:attribute name="victim">
          <xsl:value-of select="deadlock/victim-list/victimProcess/@id"/>
        </xsl:attribute>
        <xsl:apply-templates select="deadlock/process-list"/>
        <xsl:apply-templates select="deadlock/resource-list"/>
      </deadlock>
    </deadlock-list>
  </xsl:template>

  <xsl:template match="process-list">
    <process-list>
      <xsl:apply-templates select="@* | node()"/>
    </process-list>
  </xsl:template>

  <xsl:template match="resource-list">
    <resource-list>
      <xsl:apply-templates select="@* | node()"/>
    </resource-list>
  </xsl:template>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>


</xsl:stylesheet>
Articles tagged

Comment changer la valeur d'une colonne identity sous SQLServer ?

Voici un exemple de table avec une colonne identity :

CREATE TABLE IDENTITYTABLE(Id int IDENTITY(1,1) NOT NULL,c char(1), i int)
go

 

On insère 10 lignes

insert into IDENTITYTABLE values ('a',1)
go 10
select * from IDENTITYTABLE
go

 

Ce qui donne le résultat attendu :

1    a    1
2    a    1
3    a    1
4    a    1
5    a    1
6    a    1
7    a    1
8    a    1
9    a    1
10    a    1

 

Maintenant, on change la valeur de la prochaine identity :

DBCC CHECKIDENT (IDENTITYTABLE, RESEED, 99)
go

Checking identity information: current identity value '10', current column value '99'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

 

On insert à nouveau 10 lignes et voici le résultat obtenu :

1    a    1
2    a    1
3    a    1
4    a    1
5    a    1
6    a    1
7    a    1
8    a    1
9    a    1
10    a    1
100    b    2
101    b    2
102    b    2
103    b    2
104    b    2
105    b    2
106    b    2
107    b    2
108    b    2
109    b    2

 

Nous voyons clairement que l'on passe directement de 10 à 100.

 

 

 

Comment récupérer une base à partir du fichier mdf ?

1 Faire une copie des fichiers encore présents de la base de données.
2 Procéder à la création d'une nouvelle base de donnée
Elle devra porter les mêmes noms de fichiers ( .MDF et .LDF) que l'ancienne
3 Stopper le service SQLServer
4 Détruire les fichiers de la base nouvellement créée.
5 Renommer les premiers fichiers de base pour qu'ils correspondent à ceux de la base précédemment créée
6 Redémarrer le service SQLServer.
A ce stade la base de données devrait être active et fonctionner.
Si par contre, elle apparaît en suspect il ne faut pas s'inquiéter. Il faut procéder aux étapes suivantes.
7 Avec l'analyseur de requêtes, se connecter sur le serveur sur la base master et effectuer les commandes suivantes

sp_configure 'allow updates',1
reconfigure with override
UPDATE sysdatabases SET status=32768 WHERE name='bdName'

8 Stopper le service SQLServer.
9 Renommer le fichier Log en .old (ou toute autre extension)
10 Redémarrer le service SQLServer. ( Si ce n'était pas déjà le cas, la base apparaît en 'suspect')
11 DBCC rebuild_log ('bdName','chemin complet et nom du fichier log à reconstruire')
12 UPDATE sysdatabases SET status=0 WHERE name='bdName'
13 Puis pour finir

DBCC checkdb ('bdName ')
GO
DBCC newalloc ('bdName ')
GO
DBCC checkcatalog ('bdName ')
GO

Ceci pour vérifier la cohérence de la base de données

Afficher la différence entre n lignes d'une table dans SQLServer

Nous avons une table 'arch_dm_os_performance_counters' avec les lignes suivantes :

DateCollect                         Page lookups/sec
2013-05-21 10:10:00.287    48929368335
2013-05-21 10:15:00.327    48929486443
2013-05-21 10:20:00.367    48929553472
2013-05-21 10:25:00.420    48933159477
2013-05-21 10:30:00.457    48934613177
2013-05-21 10:35:00.607    49051424461
2013-05-21 10:40:00.733    49197499383
2013-05-21 10:45:00.807    49269614483
2013-05-21 10:50:00.857    49361353885
2013-05-21 10:55:00.953    49455296177
2013-05-21 11:00:00.943    49551027790
2013-05-21 11:05:00.117    49623120162
2013-05-21 11:10:00.153    49623180626

 

 

Nous cherchons à afficher ici le différentiel entre chaque ligne par date de collecte pour le résultat suivant :

DateCollect                      Page lookups/sec          DateCollect                 Page lookups/sec    Diff Page lookups/sec
2013-05-21 10:15:00.327    48929486443    2013-05-21 10:10:00.287    48929368335    118108
2013-05-21 10:20:00.367    48929553472    2013-05-21 10:15:00.327    48929486443    67029
2013-05-21 10:25:00.420    48933159477    2013-05-21 10:20:00.367    48929553472    3606005
2013-05-21 10:30:00.457    48934613177    2013-05-21 10:25:00.420    48933159477    1453700
2013-05-21 10:35:00.607    49051424461    2013-05-21 10:30:00.457    48934613177    116811284
2013-05-21 10:40:00.733    49197499383    2013-05-21 10:35:00.607    49051424461    146074922
2013-05-21 10:45:00.807    49269614483    2013-05-21 10:40:00.733    49197499383    72115100
2013-05-21 10:50:00.857    49361353885    2013-05-21 10:45:00.807    49269614483    91739402
2013-05-21 10:55:00.953    49455296177    2013-05-21 10:50:00.857    49361353885    93942292
2013-05-21 11:00:00.943    49551027790    2013-05-21 10:55:00.953    49455296177    95731613
2013-05-21 11:05:00.117    49623120162    2013-05-21 11:00:00.943    49551027790    72092372
2013-05-21 11:10:00.153    49623180626    2013-05-21 11:05:00.117    49623120162    60464

 

 

Voici la requête sql permettant d'obtenir ce résultat :

;WITH A AS
(select ROW_NUMBER()OVER (order by A.datecollect) RowNumber, A.datecollect, A.[Page lookups/sec]
FROM arch_dm_os_performance_counters A
where A.DateCollect > '2013/05/21 10:10' and A.DateCollect < '2013/05/21 11:15')
SELECT A.DateCollect, A.[Page lookups/sec],
    B.DateCollect, B.[Page lookups/sec],
    A.[Page lookups/sec]-B.[Page lookups/sec] as [Diff Page lookups/sec]
FROM A
INNER JOIN
(SELECT ROW_NUMBER()OVER (order by Datecollect) RowNumber, datecollect, [Page lookups/sec]
FROM arch_dm_os_performance_counters
where DateCollect > '2013/05/21 10:10' and DateCollect < '2013/05/21 11:15'
) B ON A.RowNumber = B.rownumber+1

 

 

La requête suivante permet de n'afficher que la Date de collecte et la colonne contenant le différentiel :

SELECT A.DateCollect,
(A.[Page lookups/sec]-B.[Page lookups/sec])/DATEDIFF(SS,B.DateCollect,A.DateCollect) as [Diff Page lookups/sec]
FROM
(select ROW_NUMBER()OVER (order by A.datecollect) RowNumber, A.datecollect, A.[Page lookups/sec]
FROM arch_dm_os_performance_counters A
where A.DateCollect > '2013/05/21 10:10' and A.DateCollect < '2013/05/21 11:15') A
INNER JOIN
(SELECT ROW_NUMBER()OVER (order by Datecollect) RowNumber, datecollect, [Page lookups/sec]
FROM arch_dm_os_performance_counters
where DateCollect > '2013/05/21 10:10' and DateCollect < '2013/05/21 11:15') B
ON A.RowNumber = B.rownumber+1
where DATEDIFF(SS,B.DateCollect,A.DateCollect)>0

 

 

Résultat :

DateCollect                         Diff Page lookups/sec
2013-05-21 10:15:00.327    393
2013-05-21 10:20:00.367    223
2013-05-21 10:25:00.420    12020
2013-05-21 10:30:00.457    4845
2013-05-21 10:35:00.607    389370
2013-05-21 10:40:00.733    486916
2013-05-21 10:45:00.807    240383
2013-05-21 10:50:00.857    305798
2013-05-21 10:55:00.953    313140
2013-05-21 11:00:00.943    319105
2013-05-21 11:05:00.117    240307
2013-05-21 11:10:00.153    201

 

Merci à Olivier pour cet article

Pb de perfs avec la procedure sp_executesql

Symptômes :


                Temps d'exécutions aléatoires des requêtes suite à une mise en PROD
                Non réponses aléatoire de certaines requêtes  

 

Causes  :


                Comportement du sp_executesql (ce n’est pas un bug, c’est une limite d’utilisation)

                Cette proc permet d'exécuter du code mais de garder le plan en cache pour une utilisation ultérieure, le problème c'est que les paramètres qui sont passés dans notre cas modifient beaucoup la sélectivité de la requête du coup le plan réutilisé n'est peut être pas approprié.

 

Mise en évidence :


                        'TRAPPER' la requête applicative via perfmon + le jeu de SET commande
               
                                Example:

                                        set quoted_identifier on
                                        set arithabort off
                                        set numeric_roundabort off
                                        set ansi_warnings on
                                        set ansi_padding on
                                        set ansi_nulls on
                                        set concat_null_yields_null on
                                        set cursor_close_on_commit off
                                        set implicit_transactions off
                                        set language Français
                                        set dateformat dmy
                                        set datefirst 1
                                        set transaction isolation level read committed
                               
                                exec sp_executesql N'SELECT top 110000 this_.IdOrdreEspece as IdOrdreE1_996_0_, this_.CodSens as CodSens996_0_, this_.IdCleRegroupement as IdCleReg3_996_0_,                                                 this_.CodEtablissementTiers as CodEtabl4_996_0_, this_.CodGuichetTiers as CodGuich5_996_0_, this_.CodCompteTiers as CodCompt6_996_0_, this_.CodCleRibTiers as                                                 CodCleRi7_996_0_, this_.DatEffet as DatEffet996_0_, this_.DatCreation as DatCreat9_996_0_, this_.DatModification as DatModi10_996_0_, this_.LoginCreation as LoginCr11_996_0_,                                 this_.LoginModification as LoginMo12_996_0_, this_.MntOrdre as MntOrdre996_0_, this_.TypEtatOrdre as TypEtat14_996_0_, this_.LibDebit as LibDebit996_0_, this_.LibCredit as                                 LibCredit996_0_, this_.LibCommentaire as LibComm17_996_0_, this_.LibBeneficiaire as LibBene18_996_0_, this_.TypOrdre as TypOrdre996_0_, this_.CodCompte as CodCompte996_0_,                                 this_.LibIntitule as LibInti21_996_0_, this_.CodDevise as CodDevise996_0_, this_.LibMessageErreur as LibMess23_996_0_, this_.MntEspeceJCP as MntEspe24_996_0_,                                                 this_.MntEspeceJ1CP as MntEspeceJ25_996_0_, this_.MntPatrimoineJCP as MntPatr26_996_0_, this_.MntPatrimoineJ1CP as MntPatr27_996_0_, this_.MntEspeceJCT as                                                 MntEspe28_996_0_, this_.MntEspeceJ1CT as MntEspeceJ29_996_0_, this_.MntPatrimoineJCT as MntPatr30_996_0_, this_.MntPatrimoineJ1CT as MntPatr31_996_0_ FROM                                         db_ldw.dbo.LUT_V_CarnetOrdreEspece this_ WHERE this_.DatCreation >= @p0 and this_.DatCreation < @p1 and this_.IdCleRegroupement = @p2',N'@p0 datetime,@p1 datetime,@p2                                 bigint',@p0='12/12/2010 00:00:00',@p1='20/12/2010 00:00:00',@p2=4678913124410789674
       
        Attention !!        Par defautl sql management studio met le set arithabort à 'on' alors que l'application le met à 'off', du coup les plans changent dans le procédure cache.
                       
                        1        DBCC FREEPROCCACHE;                (attention en prod ca peut couter cher)
                        2        jouer les SET commandes et la requête sur un petit périmètre (ici c'est le @p2 qui spécifie le carnet d'ordre des clients (petit pour 1 client mais gros pour un ensemble de clients)

  • normalement l'exécution est bonne et le plan est en cache
  • select * from master..syscacheobjects where sql like '%un bout de votre code%'                

                        3        jouer les SET commandes et la requête sur un Gros périmètre

  • La, c'est le drame, ça rame, le plan réutilisé n'est pas adapté pour un gros périmètre (confirmation avec le show plan )

 

Faites l'inverse :

                        1        DBCC FREEPROCCACHE;                (attention en prod ca peut couter cher)
                        2        Jouer les SET commandes et la requête sur un Gros périmètre

  • Normalement l'exécution est bonne et le plan est en cache
  • select * from master..syscacheobjects where sql like '%un bout de votre code%'

     
                        3        Jouer les SET commandes et la requête sur un petit périmètre

  • La, ca dépote, le plan plus 'complet' du gros périmètre est aussi valable pour les petites requêtes.


Erreur à ne pas faire :

Mettre à jour les stats à outrance, nous avons l'impression que ca va mieux, mais ce n'est pas à cause de la mise à jour des stats mais à cause de l'effet de bord :  la mise à jour des stats ayant invalidée les plans d'exécutions du cache pour les requêtes référençant les tables ou index mis à jour.

 

 

Solution :

Pour une fois, il est possible d'utiliser la commande (RECOMPILE) :


                        exec sp_executesql N'SELECT top 110000 this_.IdOrdreEspece as IdOrdreE1_996_0_, this_.CodSens as CodSens996_0_, this_.IdCleRegroupement as IdCleReg3_996_0_,                                                 this_.CodEtablissementTiers as CodEtabl4_996_0_, this_.CodGuichetTiers as CodGuich5_996_0_, this_.CodCompteTiers as CodCompt6_996_0_, this_.CodCleRibTiers as                                                 CodCleRi7_996_0_, this_.DatEffet as DatEffet996_0_, this_.DatCreation as DatCreat9_996_0_, this_.DatModification as DatModi10_996_0_, this_.LoginCreation as LoginCr11_996_0_,                                 this_.LoginModification as LoginMo12_996_0_, this_.MntOrdre as MntOrdre996_0_, this_.TypEtatOrdre as TypEtat14_996_0_, this_.LibDebit as LibDebit996_0_, this_.LibCredit as                                 LibCredit996_0_, this_.LibCommentaire as LibComm17_996_0_, this_.LibBeneficiaire as LibBene18_996_0_, this_.TypOrdre as TypOrdre996_0_, this_.CodCompte as CodCompte996_0_,                                 this_.LibIntitule as LibInti21_996_0_, this_.CodDevise as CodDevise996_0_, this_.LibMessageErreur as LibMess23_996_0_, this_.MntEspeceJCP as MntEspe24_996_0_,                                                 this_.MntEspeceJ1CP as MntEspeceJ25_996_0_, this_.MntPatrimoineJCP as MntPatr26_996_0_, this_.MntPatrimoineJ1CP as MntPatr27_996_0_, this_.MntEspeceJCT as                                                 MntEspe28_996_0_, this_.MntEspeceJ1CT as MntEspeceJ29_996_0_, this_.MntPatrimoineJCT as MntPatr30_996_0_, this_.MntPatrimoineJ1CT as MntPatr31_996_0_ FROM                                         db_ldw.dbo.LUT_V_CarnetOrdreEspece this_ WHERE this_.DatCreation >= @p0 and this_.DatCreation < @p1 and this_.IdCleRegroupement = @p2 OPTION (RECOMPILE) ',N'@p0                         datetime,@p1 datetime,@p2 bigint',@p0='12/12/2010 00:00:00',@p1='20/12/2010 00:00:00',@p2=4678913124410789674
       

Impacts :

 

  • Légère augmentation CPU dû à la recompilation des plans à chaque appels
  • Augmentation du temps de traitement de la requête pour les mêmes raisons

 

 

 Merci Matthieu !!!

Trouver le compte de service d'une instance MSSQL

DECLARE @ServiceaccountName varchar(250)
DECLARE @CurrentSet varchar(250)
if @@SERVICENAME = 'MSSQLSERVER'
select @CurrentSet = 'SYSTEM\CurrentControlSet\Services\'+@@SERVICENAME
else
select @CurrentSet = 'SYSTEM\CurrentControlSet\Services\MSSQL$'+@@SERVICENAME
EXECUTE master.dbo.xp_instance_regread
N'HKEY_LOCAL_MACHINE',
@CurrentSet,
N'ObjectName',
@ServiceAccountName OUTPUT,
N'no_output'
 
SELECT @@servername + ' - ' + @ServiceaccountName

Convertir cellules/lignes en colonnes sous SQLServer

 

On va prendre l'exemple simple d'afficher les colonnes des indexes dans une seule cellule.

Requête :

SELECT
sys.objects.name AS object_name,
sys.indexes.name AS index_name,
case
when (is_unique = 1 and is_primary_key = 1) then 'PK UNIQUE '
when is_unique = 1  then 'UNIQUE '
else ''
end + sys.indexes.type_desc type_desc,
c.index_columns AS index_columns_key
FROM sys.objects
JOIN sys.indexes
ON sys.indexes.object_id=sys.objects.object_id
JOIN
(SELECT distinct
object_id,
index_id,
stuff((SELECT ','+col_name(object_id,column_id ) as 'data()'
FROM sys.index_columns t2
WHERE t1.object_id =t2.object_id
and t1.index_id = t2.index_id
FOR XML PATH ('')),1,1,'') as 'index_columns'
FROM sys.index_columns t1
) c
ON c.index_id = sys.indexes.index_id
AND c.object_id = sys.indexes.object_id
WHERE sys.objects.type='u'
ORDER BY 1

 

Résultat :

object_name index_name type_desc index_columns_key
spt_values spt_valuesclust UNIQUE CLUSTERED name ,number ,type
spt_values ix2_spt_values_nu_nc NONCLUSTERED number ,type

 

 

SSIS : Connect to SSIS Service on machine failed

J'essayai de lancer en remote à SSIS (SQL Server Integration Services) et j'ai le message d'erreur suivant :

 

 

Pour corriger ce problème ,voici la démarche à suivre :


  1. Dans le menu Démarrer, puis Settings , lancer Control Panel, double-click Administrative Tools, puis double-click Component Services.

  2. Ouvrir le noeud Component Services sur le menu de gauche.Ouvrir le noeud Computers, ouvrir My Computer, et cliquer sur DCOM Config.

  3. Selectionner le noeud DCOM Config.

  4. Clique droit sur MsDtsServer et choisir Properties.

  5. Choisir l'onglet Security.

  6. Dans Launch and Activation Permissions, choisir Customize, cliquer sur Edit pour ouvrir la boite de dialogue Launch Permission.

  7. Dans la boite de dialogue Launch Permission, choisir ou ajouter l'utilisateur ou le groupe approprié, lui donner les droits Remote Activation (Ceci permet à l'utilisateur de lancer SSIS à distance.

  8. Cliquer sur OK.

  9. Redémarrer le service Integration Services.

  10. Si cela ne marche toujours pas, il faut faire un clique droit sur My Computer, cliquer sur Properties.
  11. Cliquer sur l'onglet COM Security, puis cliquer sur Edit Limits...
  12. Ajouter un utilisateur ou un groupe sur lequel il faut les droits ou vérifier qu'il existe dans un groupe déjà défini.
  13. Ajouter les droits Remote Activation au groupe ou à l'utilisateur.


Si ca ne marche toujours pas, je suis désolé mais je ne sais que vous dire