Discussione:
Cambiare un tipo di dati in una vista
(troppo vecchio per rispondere)
julien
2005-08-25 16:19:06 UTC
Permalink
Ciao,

ho un problema, devo cambiare il tipo di una data varchar in nvarchar.
questa data e utilizzata in una vista ma quando faccio:
select * from information_schema.tables
questa data è in nvarchar nella tavola ma nella vista e ancora in varchar..
xche?
come fare per cambiare il tipo nella vista?
ho pensato a cancellare tutte le viste e a rifarle tutte ma dove posso
trovare la definizione di tutte queste viste? in syscomments so che possiamo
trovare questa definizione ma non è sembre buona e non e l'ultima
definizione... (e qualche volte non c'e niente..). dove posso trovare queste
definizone?

magari c'e un altra soluzione?

grazie mille.

julien
Andrea Montanari
2005-08-25 17:27:44 UTC
Permalink
salve Julien
Post by julien
ho un problema, devo cambiare il tipo di una data varchar in nvarchar.
select * from information_schema.tables
questa data è in nvarchar nella tavola ma nella vista e ancora in
varchar.. xche?
come fare per cambiare il tipo nella vista?
ho pensato a cancellare tutte le viste e a rifarle tutte ma dove posso
trovare la definizione di tutte queste viste? in syscomments so che
possiamo trovare questa definizione ma non è sembre buona e non e
l'ultima definizione... (e qualche volte non c'e niente..). dove
posso trovare queste definizone?
innanzitutto NON modificare le viste INFORMATION_SCHEMA... queste viste sono
state disegnate e progettate da Microsoft per essere conformi allo standard
ANSI ... ed al di la' di cio', ogni aggiornamento/service pack potrebbe
modificarle...
per quel che riguarda INFORMATION_SCHEMA.TABLES, questa si basa sulla
tabella di sistema dbo.sysobject, le cui colonne non sono nvarchar ma
solitamente sysname... sysname e' un sinonimo di nvarchar, come puoi anche
vedere da
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_da-db_7msw.asp ,
quindi, ad esempio, la proiezione di INFORMATION_SCHEMA.TABLES.name e'
sicuramente di tipo nvarchar ...

per il recupero del testo di viste, procedure e funzioni non criptate puoi
utilizzare la procedura di sistema sp_heltext
EXEC sp_helptext '[INFORMATION_SCHEMA].[TABLES]'
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sp_help_7c38.asp

se comunque definisci una vista basata sulle viste ANSI INFORMATION_SCHEMA,
il rispettivo risultato e' comunque definito dalla colonna di origine... ma
puoi benissimo castarlo in un altro tipo di dato, ad esempio
SELECT CONVERT( nvarchar , t.name)
FROM INFORMATION_SCHEMA.TABLES t
WHERE .....
che in questo caso e' ridondante...
saluti
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz/DbaMgr.shtm http://italy.mvps.org
DbaMgr2k ver 0.15.0 - DbaMgr ver 0.60.0
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply
julien
2005-08-25 19:10:02 UTC
Permalink
ciao andrea,

grazie mille per la tua risposta,
ma mi son sbagliato quando dico di tipo nvarchar voglio dire che è
l'attributo che ha questo tipo e non la meta table.
allora per esempio ho una tabella che se chiama "Sport" e in questa tabella
un attributto "nome" e una vista v_sposport.
se faccio alter table sport alter column nome nvarchar(30)
allora quando faccio
select * from information_schema.columns
allora ho
sport nome nvarchar 30
v_sport nome varchar(30)

ma ho trovato la mia risposta:
devo fare sp_refreshview v_sport
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sp_ra-rz_7qnr.asp

grazie mille

ciao

ju
Post by Andrea Montanari
salve Julien
Post by julien
ho un problema, devo cambiare il tipo di una data varchar in nvarchar.
select * from information_schema.tables
questa data è in nvarchar nella tavola ma nella vista e ancora in
varchar.. xche?
come fare per cambiare il tipo nella vista?
ho pensato a cancellare tutte le viste e a rifarle tutte ma dove posso
trovare la definizione di tutte queste viste? in syscomments so che
possiamo trovare questa definizione ma non è sembre buona e non e
l'ultima definizione... (e qualche volte non c'e niente..). dove
posso trovare queste definizone?
innanzitutto NON modificare le viste INFORMATION_SCHEMA... queste viste sono
state disegnate e progettate da Microsoft per essere conformi allo standard
ANSI ... ed al di la' di cio', ogni aggiornamento/service pack potrebbe
modificarle...
per quel che riguarda INFORMATION_SCHEMA.TABLES, questa si basa sulla
tabella di sistema dbo.sysobject, le cui colonne non sono nvarchar ma
solitamente sysname... sysname e' un sinonimo di nvarchar, come puoi anche
vedere da
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_da-db_7msw.asp ,
quindi, ad esempio, la proiezione di INFORMATION_SCHEMA.TABLES.name e'
sicuramente di tipo nvarchar ...
per il recupero del testo di viste, procedure e funzioni non criptate puoi
utilizzare la procedura di sistema sp_heltext
EXEC sp_helptext '[INFORMATION_SCHEMA].[TABLES]'
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sp_help_7c38.asp
se comunque definisci una vista basata sulle viste ANSI INFORMATION_SCHEMA,
il rispettivo risultato e' comunque definito dalla colonna di origine... ma
puoi benissimo castarlo in un altro tipo di dato, ad esempio
SELECT CONVERT( nvarchar , t.name)
FROM INFORMATION_SCHEMA.TABLES t
WHERE .....
che in questo caso e' ridondante...
saluti
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz/DbaMgr.shtm http://italy.mvps.org
DbaMgr2k ver 0.15.0 - DbaMgr ver 0.60.0
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply
Lorenzo Benaglia
2005-08-25 19:46:44 UTC
Permalink
Post by julien
devo fare sp_refreshview v_sport
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sp_ra-rz_7qnr.asp
Esatto, ti stavo preparando la seguente risposta che ormai TI DEVI SORBIRE
LOL

Quando crei una vista, le colonne specificate vengono inserite nella tabella
di sistema syscolumns mentre l'istruzione T-SQL CREATE VIEW... viene
inserita nella tabella syscomments.
Di conseguenza queste informazioni sono statiche, nel senso che non
riflettono le modifiche effettuate sulle tabelle referenziate dalla vista.
Se vuoi aggiornare le viste devi risocostruirle cancellandole e ricreandole
oppure modificandole tramite il comando ALTER VIEW.
In alternativa SQL Server ci offre la stored procedure di sistema
sp_refreshview che "rinfresca" i metadati delle viste.

Prova a dare una occhiata al seguente esempio:

USE tempdb
GO

/* Definisco la tabella dbo.Students */
CREATE TABLE dbo.Students(
StudentID int NOT NULL IDENTITY PRIMARY KEY,
FirstName varchar(10) NOT NULL,
LastName varchar(10) NOT NULL
)
GO

/* La popolo */
SET NOCOUNT ON
INSERT dbo.Students VALUES('Lorenzo', 'Benaglia')
INSERT dbo.Students VALUES('Luca', 'Bianchi')
INSERT dbo.Students VALUES('Andrea', 'Montanari')
INSERT dbo.Students VALUES('Gianluca', 'Hotz')
SET NOCOUNT OFF
GO

/* Definisco la vista dbo.vw_GetStudentsFirstName */
CREATE VIEW dbo.vw_GetStudentsFirstName
AS
SELECT FirstName
FROM dbo.Students
GO

/* Definisco la vista dbo.vw_GetStudents */
CREATE VIEW dbo.vw_GetStudents
AS
SELECT *
FROM dbo.Students
GO

/* Vediamo il data type della colonna FirstName della tabella e delle due
viste */
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = N'FirstName'
AND TABLE_SCHEMA = N'dbo'
AND TABLE_NAME IN(N'Students', N'vw_GetStudentsFirstName',
N'vw_GetStudents')
GO

/* Output:

TABLE_NAME COLUMN_NAME DATA_TYPE
------------------------- ------------ ----------
Students FirstName varchar
vw_GetStudents FirstName varchar
vw_GetStudentsFirstName FirstName varchar

(3 row(s) affected)

*/

/* Modifico il data type della colonna FirstName
** nella tabella dbo.Students
*/
ALTER TABLE dbo.Students
ALTER COLUMN FirstName nvarchar(10) NOT NULL
GO

/* Vediamo il data type della colonna FirstName della tabella e delle due
viste */
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = N'FirstName'
AND TABLE_SCHEMA = N'dbo'
AND TABLE_NAME IN(N'Students', N'vw_GetStudentsFirstName',
N'vw_GetStudents')
GO

/* Output:

TABLE_NAME COLUMN_NAME DATA_TYPE
------------------------- ------------ ----------
Students FirstName nvarchar
vw_GetStudents FirstName varchar
vw_GetStudentsFirstName FirstName varchar

(3 row(s) affected)

*/

/* Come puoi vedere la modifica del data type nella tabella base non è stata
** riflessa nei metadati delle viste.
** OK, diamo loro una bella "rinfrescata" :-D
*/
EXEC sp_refreshview [dbo.vw_GetStudentsFirstName]
EXEC sp_refreshview [dbo.vw_GetStudents]
GO

/* Vediamo il data type della colonna FirstName della tabella e delle due
viste */
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = N'FirstName'
AND TABLE_SCHEMA = N'dbo'
AND TABLE_NAME IN(N'Students', N'vw_GetStudentsFirstName',
N'vw_GetStudents')
GO

/* Output:

TABLE_NAME COLUMN_NAME DATA_TYPE
------------------------- ------------ ----------
Students FirstName nvarchar
vw_GetStudents FirstName nvarchar
vw_GetStudentsFirstName FirstName nvarchar

(3 row(s) affected)

*/

/* Nel caso in cui le viste da aggiornare siano tante,
** puoi generare i comandi di aggiornamento servendoti
** delle information_schema views
*/
SELECT N'EXEC sp_refreshview [' +
TABLE_SCHEMA + N'.' +
TABLE_NAME + N']' AS RefreshCommand
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = N'VIEW'
AND TABLE_NAME NOT LIKE 'sys%'
GO

/* Output:

RefreshCommand
--------------------------------------------------
EXEC sp_refreshview [dbo.vw_GetStudents]
EXEC sp_refreshview [dbo.vw_GetStudentsFirstName]

(2 row(s) affected)

*/

/* Pulizia */
DROP VIEW dbo.vw_GetStudentsFirstName, dbo.vw_GetStudents
DROP TABLE dbo.Students

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
julien
2005-08-26 12:50:05 UTC
Permalink
grazie mille lorenzo!!
ho provato sta mattina e funziona bene!
ciao
julien
Post by Lorenzo Benaglia
Post by julien
devo fare sp_refreshview v_sport
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sp_ra-rz_7qnr.asp
Esatto, ti stavo preparando la seguente risposta che ormai TI DEVI SORBIRE
LOL
Quando crei una vista, le colonne specificate vengono inserite nella tabella
di sistema syscolumns mentre l'istruzione T-SQL CREATE VIEW... viene
inserita nella tabella syscomments.
Di conseguenza queste informazioni sono statiche, nel senso che non
riflettono le modifiche effettuate sulle tabelle referenziate dalla vista.
Se vuoi aggiornare le viste devi risocostruirle cancellandole e ricreandole
oppure modificandole tramite il comando ALTER VIEW.
In alternativa SQL Server ci offre la stored procedure di sistema
sp_refreshview che "rinfresca" i metadati delle viste.
USE tempdb
GO
/* Definisco la tabella dbo.Students */
CREATE TABLE dbo.Students(
StudentID int NOT NULL IDENTITY PRIMARY KEY,
FirstName varchar(10) NOT NULL,
LastName varchar(10) NOT NULL
)
GO
/* La popolo */
SET NOCOUNT ON
INSERT dbo.Students VALUES('Lorenzo', 'Benaglia')
INSERT dbo.Students VALUES('Luca', 'Bianchi')
INSERT dbo.Students VALUES('Andrea', 'Montanari')
INSERT dbo.Students VALUES('Gianluca', 'Hotz')
SET NOCOUNT OFF
GO
/* Definisco la vista dbo.vw_GetStudentsFirstName */
CREATE VIEW dbo.vw_GetStudentsFirstName
AS
SELECT FirstName
FROM dbo.Students
GO
/* Definisco la vista dbo.vw_GetStudents */
CREATE VIEW dbo.vw_GetStudents
AS
SELECT *
FROM dbo.Students
GO
/* Vediamo il data type della colonna FirstName della tabella e delle due
viste */
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = N'FirstName'
AND TABLE_SCHEMA = N'dbo'
AND TABLE_NAME IN(N'Students', N'vw_GetStudentsFirstName',
N'vw_GetStudents')
GO
TABLE_NAME COLUMN_NAME DATA_TYPE
------------------------- ------------ ----------
Students FirstName varchar
vw_GetStudents FirstName varchar
vw_GetStudentsFirstName FirstName varchar
(3 row(s) affected)
*/
/* Modifico il data type della colonna FirstName
** nella tabella dbo.Students
*/
ALTER TABLE dbo.Students
ALTER COLUMN FirstName nvarchar(10) NOT NULL
GO
/* Vediamo il data type della colonna FirstName della tabella e delle due
viste */
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = N'FirstName'
AND TABLE_SCHEMA = N'dbo'
AND TABLE_NAME IN(N'Students', N'vw_GetStudentsFirstName',
N'vw_GetStudents')
GO
TABLE_NAME COLUMN_NAME DATA_TYPE
------------------------- ------------ ----------
Students FirstName nvarchar
vw_GetStudents FirstName varchar
vw_GetStudentsFirstName FirstName varchar
(3 row(s) affected)
*/
/* Come puoi vedere la modifica del data type nella tabella base non è stata
** riflessa nei metadati delle viste.
** OK, diamo loro una bella "rinfrescata" :-D
*/
EXEC sp_refreshview [dbo.vw_GetStudentsFirstName]
EXEC sp_refreshview [dbo.vw_GetStudents]
GO
/* Vediamo il data type della colonna FirstName della tabella e delle due
viste */
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = N'FirstName'
AND TABLE_SCHEMA = N'dbo'
AND TABLE_NAME IN(N'Students', N'vw_GetStudentsFirstName',
N'vw_GetStudents')
GO
TABLE_NAME COLUMN_NAME DATA_TYPE
------------------------- ------------ ----------
Students FirstName nvarchar
vw_GetStudents FirstName nvarchar
vw_GetStudentsFirstName FirstName nvarchar
(3 row(s) affected)
*/
/* Nel caso in cui le viste da aggiornare siano tante,
** puoi generare i comandi di aggiornamento servendoti
** delle information_schema views
*/
SELECT N'EXEC sp_refreshview [' +
TABLE_SCHEMA + N'.' +
TABLE_NAME + N']' AS RefreshCommand
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = N'VIEW'
AND TABLE_NAME NOT LIKE 'sys%'
GO
RefreshCommand
--------------------------------------------------
EXEC sp_refreshview [dbo.vw_GetStudents]
EXEC sp_refreshview [dbo.vw_GetStudentsFirstName]
(2 row(s) affected)
*/
/* Pulizia */
DROP VIEW dbo.vw_GetStudentsFirstName, dbo.vw_GetStudents
DROP TABLE dbo.Students
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Lorenzo Benaglia
2005-08-25 18:53:58 UTC
Permalink
Post by julien
ho un problema, devo cambiare il tipo di una data varchar in nvarchar.
Ciao julien,

intendi dire che vuoi cambiare il data type di una colonna varchar
contenente date in nvarchar?
Se la risposta è affermativa ti fermo subito, in quanto SQL Server offre 2
data types per memorizzare le informazioni data e ora:
- datetime
- smalldatetime

Sui Books Online puoi trovare tutti i dettagli di questi data types ed
inoltre ti suggerisco di leggere molto attentamente gli articoli menzionati
nel seguente tip:
http://www.dotnethell.it/tips/SQLServerDates.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
julien
2005-08-25 19:14:01 UTC
Permalink
ciao lorenzo,

non hai capito la mia domanda (e vero che non l'ho ben scritto:))
grazie per la tua risposta, puoi guardare l'altro messagio che ho inviato 2
secondi fa per proprio capirla:)
adesso ho trovato la soluzione
ma cmq grazie mille!!!

ciao

ju
Post by Lorenzo Benaglia
Post by julien
ho un problema, devo cambiare il tipo di una data varchar in nvarchar.
Ciao julien,
intendi dire che vuoi cambiare il data type di una colonna varchar
contenente date in nvarchar?
Se la risposta è affermativa ti fermo subito, in quanto SQL Server offre 2
- datetime
- smalldatetime
Sui Books Online puoi trovare tutti i dettagli di questi data types ed
inoltre ti suggerisco di leggere molto attentamente gli articoli menzionati
http://www.dotnethell.it/tips/SQLServerDates.aspx
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Luigi
2006-07-17 10:09:01 UTC
Permalink
Ciao Lorenzo,
scusa se ritorno su questo topic (è simile alla mia domanda).
Volevo sapere per quali casi sarebbe utile un tipo di dato Real, e se per
impostare un campo "percentuale" (con al massimo 2 valori decimali, ad es.
35.50%) ti sembra la migliore soluzione.
Ti ringrazio.
Post by Lorenzo Benaglia
Post by julien
ho un problema, devo cambiare il tipo di una data varchar in nvarchar.
Ciao julien,
intendi dire che vuoi cambiare il data type di una colonna varchar
contenente date in nvarchar?
Se la risposta è affermativa ti fermo subito, in quanto SQL Server offre 2
- datetime
- smalldatetime
Sui Books Online puoi trovare tutti i dettagli di questi data types ed
inoltre ti suggerisco di leggere molto attentamente gli articoli menzionati
http://www.dotnethell.it/tips/SQLServerDates.aspx
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Lorenzo Benaglia
2006-07-17 11:31:31 UTC
Permalink
Post by Luigi
Volevo sapere per quali casi sarebbe utile un tipo di dato Real, e se
per impostare un campo "percentuale" (con al massimo 2 valori
decimali, ad es.
35.50%) ti sembra la migliore soluzione.
Ciao Luigi,

i data type real e float sono utili quando hai la necessità di effettuare
una serie di calcoli mantenendo un'alta precisione (ad esempio in ambito
scientifico o ingegneristico).
Nel caso di una percentuale con due soli decimali, sicuramente i data type a
precisione fissa decumal e numeric risultano i più adatti.
Post by Luigi
Ti ringrazio.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Continua a leggere su narkive:
Loading...