Ho un probblemino...

mercoledì 25 febbraio 2009 - 00.08

mayck Profilo | Newbie

ciao a tutti,

mi sono appena iscritto al forum, anche se spesso visito questo sito alla ricerca di idee e soluzioni...
Ma veniamo al dunque,

Sto utilizzando MSSQL Express 2005 sp3 insieme al Menagement studio.

Sto cercando di eseguire la seguente query:

create table Turno(
Codice int identity primary key,
DataOraInizio smalldatetime not null,
DataOraFine smalldatetime
check ( 1 = (select count(*)
from Turno T
where DataOraFine is null)),
Dipendente varchar(16) not null
references Dipendente(CodiceFiscale)
)

Solo che ottengo il seguente errore:

Messaggio 1046, livello 15, stato 1, riga 5
In questo contesto sono consentite solo espressioni scalari, non subquery.

Qualcuno sa spiegarmi perche non posso utilizzare subquery?

Grazie.

lbenaglia Profilo | Guru

>Messaggio 1046, livello 15, stato 1, riga 5
>In questo contesto sono consentite solo espressioni scalari,
>non subquery.
>
>Qualcuno sa spiegarmi perche non posso utilizzare subquery?

Ciao Michele,

Semplicemente perché non puoi utilizzare subquery.
Puoi spiegarci in maggior dettaglio che genere di constraint vorresti implementare?

>Grazie.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

mayck Profilo | Newbie


La query non era completa, sorry. Di segutio riporto la querry corretta.

create table Turno(
Codice int identity primary key,
DataOraInizio smalldatetime not null ,
DataOraFine smalldatetime,
Dipendente varchar(16) not null
references Dipendente(CodiceFiscale),
check ( 0 = (select count(*)
from Turno T
where DataOraFine is null and T.Dipendente = Dipendente))
)

La tabella deve contenere i turni dei dipendenti, ad inizio turno (quando il dipendente timbra il cartellino) viene aggiunto un nuovo record nella tabella: Codice=x, DataOraInizio = xx/xx/xx xx:xx, DataOraFine=null, Dipendente = abcdefghlmn), a fine turno (quando il dipendente timbra nuovamente il cartellino) viene valorizzato l'attributo DataOraFine del record precedentemente immesso: DataOraFine = xx/xx/xx xx:xx dove Dipendente = abcdefghlmn e DataOraFine = null.
Con l'istruzione check devo controllare che non deve essere possibile inserire un nuovo record ( per un determinato dipendente ) se c'è almeno un record con l'attributo DataOraFine a null, perciò se un dipendente a timbrato l'ingresso non potra timbrare un nuovo ingresso finche non avrà timbrato l'uscita dell'ingresso precedente.
Spero di essere stato chiaro.

Non capisco perchè non posso utilizzare subquery, l'sql lo permette, almeno nel libro dove lo sto studiando io.

Grazie.

mayck Profilo | Newbie

Forse ho risolto,

ho creato la tabella cosi:

create table Turno(
Codice int identity primary key,
DataOraInizio smalldatetime not null,
DataOraFine smalldatetime not null,
Dipendente varchar(16) not null
references Dipendente(CodiceFiscale)
)

ho creato una funzione cosi:

create function dbo.check_Turno_DataOraFine (@Dipendente varchar(16))
returns tinyint
as
begin
declare @ret tinyint
set @ret = (select count(*) from Turno T where T.DataOraFine is null
and T.Dipendente = @Dipendente)
return @ret
end
go

ho inserito un constraint nella tabella Turno cosi:

alter table Turno add constraint constraint_Turno_DataOraFine check(
dbo.check_Turno_DataOraFine(Dipendente) <= 1
)

Sembra che funzioni.

Comunque non capisco perchè l'MSSQL non mi permetta di utilizzare le subquery nelle CREATE TABLE!

Grazie.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5