Visualizzazione post con etichetta Tips Sql. Mostra tutti i post
Visualizzazione post con etichetta Tips Sql. Mostra tutti i post

31/10/17

Access operatore mancante right left join [Problema risolto]

A volte eseguendo una query in access formalmente corretta se eseguita ad esempio in TSQL abbiamo un errore 'operatore mancante'.

Solitamente questo viene dovuto al fatto che Access in quel particolare caso non riesce a risolvere i join contemporaneamente per cui ha bisogno di una parentesi.

Esempio prendiamo questa query con due join

SELECT distinct Booking.Id,Cliente.LuogoResidenza,Booking.AltriComponenti1Residenza, Booking.AltriComponenti2Residenza, Booking.AltriComponenti3Residenza, Booking.AltriComponenti4Residenza,Booking.AltriComponenti5Residenza FROM ClienteRIGHT JOIN Booking ON Clienti.Id = Booking.IdCliente RIGHT JOIN Disponibilita ON Booking.Id = Disponibilita.IdBooking where not booking.id is null

Se la eseguiamo in access abbiamo un errore operatore mancante

se la modifichiamo mettendo una parentesi per il primo join funziona

SELECT distinct Booking.Id,Cliente.LuogoResidenza,Booking.AltriComponenti1Residenza, Booking.AltriComponenti2Residenza, Booking.AltriComponenti3Residenza, Booking.AltriComponenti4Residenza,Booking.AltriComponenti5Residenza FROM (Cliente RIGHT JOIN Booking ON Clienti.Id = Booking.IdCliente) RIGHT JOIN Disponibilita ON Booking.Id = Disponibilita.IdBooking where not booking.id is null




14/10/15

Come evitare e risolvere i deadlock in sql server

Spesso lavorando con Sql server ci imbattiamo durante una transazione in un messaggio criptico che dice:

Transaction (Process ID xxx) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.


Questo problema capita quando due processi si ostacolano a vicenda, cioe' uno attende l'altro per effettuare il lock.

La soluzione in questo caso è scrivere le query imponendo con la clausola in rosso un lock reale sulle tabelle come nell'esempio:


SELECT * FROM tabella WITH (XLOCK, ROWLOCK) WHERE chiave= xxx

14/09/15

Database sql server senza crescita del file log

Se avete bisogno di creare un database sql server di cui non vi importa di salvare il file di log delle transazioni tanto lo recupererete sempre facendo un backup e ripristino completo, il trucco è crearlo impostando nei parametri di creazione il recovery model del database su simple (di default è su full).
In questo modo ogni volta che fate il backup, il log del database viene troncato.
Non è proprio il massimo come Oracle, che ci permette di eliminarlo completamente ma meglio che niente.

04/05/15

Errore IErrorInfo.GetDescription failed with E_FAIL(0x80004005)

A volte lanciando una query VB:NET con OleDbProvider su database Access può verificarsi questo errore quando abbiamo chiamato il nome di un campo con una parola riservata ad esempio statement.
Il problema si risolve mettendo attorno al nome del campo le parentesi quadre, in questo modo [statement].

30/05/14

[RISOLTO] Attach di un database Sql server file mdf errore accesso negato

Può capitare collegando in microsoft sql server mangement studio che provando a collegare un file MDF in fase di attach ci siano errori che non lo consentano.
In caso di errore 5 accesso negato, la soluzione è aprire il management studio come amministratore, cliccando sul link col tasto destro del mouse e poi cliccando su esegui come amministratore, e l’attach andrà a buon fine.

04/11/13

[RISOLTO] Il driver ODBC non supporta le proprietà richieste

In una applicazione sviluppata in ASP classico con database Microsoft Sql server, può capitare che all'esecuzione di una banale query si verifichi il seguente errore:


Microsoft OLE DB Provider for ODBC Drivers error '80040e21'


Il driver ODBC non supporta le proprietà richieste.


Per risolvere il problema è sufficiente prima di fare la open del recordset, l'impostazione del cursore lato client.

Se ad esempio il vostro recordset si chiama RS, prima della chiamata RS.Open scrivere

RS.CursorLocation=3  (che sta per adUseClient)

e la vostra query tornerà magicamente a funzionare.


27/06/12

Come indicizzare una vista su Sql Server

Come sappiamo per migliorare le prestazioni di lettura di una tabella contenente una grossa mole di dati, applichiamo degli indici sui campi per i quali vengono effettuate maggiormente le queries.

 

Molti non sanno però che gli indici possono essere applicati anche alle viste.

Molte volte utilizziamo nei software per comodità delle viste dove con opportuni join mostriamo una serie di dati da varie tabelle in maniera più leggibile.

Con l’andare del tempo però, la mole dei dati aumenta e diventa indispensabile fare qualcosa per migliorare le prestazioni in lettura della vista.

Una delle cose che è possibile fare è indicizzare la vista.

16/05/12

Estrarre mese e anno da una data TSQL

Mentre con access potevamo estrarre facilmente il mese e l’anno da una data utilizzando il vbscript con le funzioni month e date, per il Tsql che è la sintassi sql utilizzata da Microsoft Sql Server, dobbiamo avvalerci della funzione datepart, che come dice la parola stessa estrare una parte di una data.

Se utilizziamo per comodità un altra funzione la getdate(), che ci restituisce la data del server su cui è installato il servizio microsoft sql server, per sapere ad esempio il mese in cui ci troviamo adesso, è sufficiente questa query:

select datepart(month ,getdate())  -----> restituisce 4

Per sapere invece l’anno in cui ci troviamo

select datepart(year,getdate())  -----> restituisce 2012

Naturalmente è sufficiente sostuire la getdate() che ci restituisce la data odierna dal server sql, col vostro campo data del database ed avrete il risultato che vi interessa.

24/04/12

Campo vuoto Ms Sql server con provider Sql native Client

Se avete un sito web sviluppato in ASP e vi capita di cambiare provider da SqlOleDb ad Sql Native Client, può capitare che alcuni campi di tipo ntext o nvarchar possano essere restituiti vuoti pur essendo pieni.

Facendo la query direttamente nel Management Studio il campo è pieno, mentre invocando la stessa query tramite recordset e oggetto connection con sql native client come provider, il campo è vuoto.

La soluzione è trasformare il campo nvarchar o ntext in varchar ed il dato magicamente tornerà pieno.

Se volete utilizzare i nuovi tipi nvarchar(max), l’unica alternativa è inserire all’interno della stringa di connessione questi parametri:

  • Provider=SQLNCLI11

  • DataTypeCompatibility=80

che consentono la compatibilità con i nuovi tipi sql.

27/08/09

Come spostare un database sql server altrove da codice con una stored procedure

Questa stored procedure di James DiMauro, sposta il file di dati e di log di una lista di database da codice. Presuppone che le directoried passate come parametri esistano e che l'account di sql che esegue la stored abbia i premessi per scrivere
nelle cartelle.
Si utilizza scrivendo in una qualsiasi finestra di query analyzer la seguente riga di codice:

exec p_MoveDatabase 'c:\sqlmovetest\','c:\sqlmovetest\','db1, db2, db3'
Il primo percorso e' la nuova posizione del database, il secondo del file di log, il terzo parametro e' l'elenco dei database da spostare, dei quali viene fatto automaticamente il detach e l'attach.
Ecco il codice da lanciare preliminarmente per la generazione della stored:

IF ( OBJECT_ID('dbo.p_MoveDatabase') IS NOT NULL )
begin
DROP PROCEDURE dbo.p_MoveDatabase
end
GO
create procedure p_MoveDatabase
@NewDataFolder nvarchar(1000),
@NewLogFolder nvarchar(1000),
@DbList nvarchar(4000)
as
Begin
declare @DbTable table (lkey int identity (1,1) primary key, dbname nvarchar(100))
declare @FileTable table (lkey int identity (1,1) primary key, [name]nvarchar(100), physical_name nvarchar(1000), [type] int )
declare @sql nvarchar(4000)
declare @count int,
@RowNum int
declare @DbName nvarchar(100)
declare @OldPath nvarchar(1000)
declare @Type int
declare @LogicalName nvarchar(100)
declare @ParmDefinition nvarchar(1000)
declare @FileName nvarchar(100)
declare @NewPath nvarchar(1000)
declare @ShowAdvOpt int
declare @XPCMD int
set nocount on;
--insert into @DbTable (dbname) values ('testdb1')
--insert into @DbTable (dbname) values ('testdb2')
if right(@DbList,1) = ','
Begin
print 'DbList must NOT end with "''"'
return
End
declare @MyString NVARCHAR(100)
declare @Pos INT
declare @NextPos INT
declare @String NVARCHAR(4000)
declare @Delimiter NVARCHAR(1)
set @String = @DbList
set @Delimiter = ','
SET @String = @String + @Delimiter
SET @Pos = charindex(@Delimiter,@String)
WHILE (@pos <> 0)
BEGIN
SET @MyString = substring(@String,1,@Pos - 1)
insert into @DbTable (dbname) values (LTRIM(RTRIM(@MyString)))
SET @String = substring(@String,@pos+1,len(@String))
SET @pos = charindex(@Delimiter,@String)
END
set @ShowAdvOpt = cast(( select [value] from sys.configurations where [name] = 'show advanced options') as int)
set @XPCMD = cast(( select [value] from sys.configurations where [name] = 'xp_cmdshell') as int)
if right(@NewDataFolder,1)<> '\' or right(@NewLogFolder,1)<>'\'
Begin
print 'new path''s must end with \'
return
end
EXEC sp_configure 'show advanced option', '1'
RECONFIGURE
exec sp_configure 'xp_cmdshell' , '1'
RECONFIGURE
print 'NewMdfFolder is ' + @NewDataFolder
print 'NewLdfFolder is ' + @NewLogFolder
SET @RowNum = 1
SET @count = (select count(*) from @DbTable)
while @RowNum <= @count
Begin
select @DbName = DBName from @DbTable
where lKey = @RowNum
set @sql = 'select name, physical_name, type from ' + @DbName + '.sys.database_files'
insert into @FileTable
exec sp_executesql @sql
-- kill all user connections by setting to single user with immediate
set @sql= 'ALTER DATABASE [' + @DbName + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE'
print ''
print 'Executing line -' + @sql
exec sp_executesql @sql
-- set db off line
set @sql = 'ALTER DATABASE [' + @DbName + '] SET OFFLINE;'
print ''
print 'Executing line - ' + @sql
exec sp_executesql @sql
select * from @FileTable
while @@rowcount > 0
begin
select top 1 @OldPath = physical_name, @Type = [type], @LogicalName = [name] from @FileTable
--move physical files
set @FileName = (SELECT REVERSE(SUBSTRING(REVERSE(@OldPath), 0, CHARINDEX('\', REVERSE(@OldPath), 1))))
if @type = 0
begin
set @NewPath = @NewDataFolder + @FileName
end
else
begin
set @NewPath = @NewLogFolder + @FileName
end
set @Sql = 'EXEC master..xp_cmdshell ''MOVE "' + @OldPath + '" "' + @NewPath +'"'''
print ''
print 'Executing line -' + @sql
exec sp_executesql @sql
--alter file paths
set @sql = 'ALTER DATABASE ' + @DbName + ' MODIFY FILE (NAME = ' + @LogicalName + ', FILENAME = "' + @NewPath + '")'
exec sp_executesql @sql
delete from @FileTable where [name] = @LogicalName
select * from @FileTable
end --while
set @sql = 'ALTER DATABASE [' + @DbName + '] SET ONLINE;'
print ''
print 'Executing line -' + @sql
exec sp_executesql @sql
SET @RowNum = @RowNum + 1
-- allow multi user again.
set @sql= 'ALTER DATABASE [' + @DbName + '] SET MULTI_USER'
print ''
print 'Executing line -' + @sql
exec sp_executesql @sql
end
exec sp_configure 'xp_cmdshell' , @XPCMD
reconfigure
EXEC sp_configure 'show advanced option', @ShowAdvOpt
RECONFIGURE
End --procedure

16/04/09

Sql server 2008 consente la modifica di 200 righe

Dopo varie installazioni di Sql Server 2008 ho notato che qualsiasi versione installassi, dalla trial alla evaluation alla express, avevo solo e sempre la possibilità di editare max 200 righe e selezionare al max 1000 righe.
Dopo aver perso un po' di tempo ho scoperto che e' possibile variare questi parametri nel menu' strumenti / opzioni del management studio.
Nel menu' commands e' possibile impostare a zero i valori di edit e select rows in maniera tale da non avere limitazioni sul numero di righe che e' possibile editare e selezionare.

23/01/08

Problemi di connessione ad Sql Server 2005 da Windows Vista

Capita spesso che un'applicazione sviluppata con vb.net 2005 si colleghi tranquillamente ad un server sql 2005 da un client xp, ma con la stessa stringa di connessione da Windows Vista il collegamento non avvenga.
Ecco alcune possibili soluzioni:

1) Verificare che su sql server l'utente del dominio con cui ci si collega a sql server sia stato caricato negli utenti di sql ed abbia come ruolo sysadmin

2) Verificare che il protocollo TCP IP sia abilitato sul server sql, la porta 1433 non sia bloccata dal firewall di Windows o di terze parti e specificarla eventualmente nella stringa di connessione (Per maggiori informazioni vedere il seguente link )
Potrebbe anche darsi che sql server non stia utilizzando affatto il protocollo TCP IP. Per verificarlo, lanciare la seguente query sul server
SELECT net_transport FROM sys.dm_exec_connections WHERE session_id = @@SPID;
Nel caso non ci sia il TCP IP, modificare la condigurazione in SQL Server Configuration Manager

3) Se il server e' la versione Express di Sql Server, installare il service pack 2 che contiene l' SQL Server 2005 User Provisioning Tool for Vista che consente di indicare gli utenti del dominio come sysadmin e quindi potersi connettere.

4) Sul client vista nel pannello di controllo - strumenti di amministrazione, cliccare sull'icona windows firewall e creare una nuova regola per il programma incriminato consentendogli le connessioni esterne, o in alternativa consentire qualsiasi traffico in ingresso ed in uscita dall'indirizzo IP del server sql.
Per maggiori informazioni su questo punto controllare
questo link e quest'altro.

5) Disabilitare l' User Account Control (UAC) di Windows Vista ,una delle nuove funzionalità presenti in Windows Vista, un sistema di sicurezza che si occupa di verificare che l’utilizzatore del computer abbia le credenziali per poter effettuare determinate operazioni.
Successivamente riavviare la macchina e da riga di comando scrivere
net user administrator /actve:yes
per avere il vecchio account administrator della macchina. Provare poi a connettersi a Sql Server 2005.

6) Configurare una porta statica TCP/IP sul server sql impostando a blank la voce "TCP Dynamic Ports" ed impostando una porta statica (ad esempio 1433) nella proprietà "TCP Port". Riavviare poi il servizio sql server