ورود

View Full Version : کمک در تغییر دستورات زیر بطوریکه view ها را نیز شامل شود



mrt_Azm
یک شنبه 05 خرداد 1392, 19:09 عصر
سلام من دستورات زیر رو در آوردم برای اینکه بتونم اطلاعات جداولم رو از قبیل نام فیلدها و نوع فیلدها استخراج کنم حالا نمیدونم چطوری ویرایشش کنم که در مورد view های جدولم هم جواب بده در حال حاضر فقط برای table هاست
ممنون میشم کمکم کنید



SELECT t.name as 'tablename',td.value as 'tbl_desc' ,c.name as 'fieldname',cd.value as 'fld_desc',sc.DATA_TYPE ,sc.CHARACTER_MAXIMUM_LENGTH as 'length'
FROM sysobjects t
INNER JOIN sysusers u
ON u.uid = t.uid
LEFT OUTER JOIN sys.extended_properties td
ON td.major_id = t.id
AND td.minor_id = 0
AND td.name = 'MS_Description'
INNER JOIN syscolumns c
ON c.id = t.id
LEFT OUTER JOIN sys.extended_properties cd
ON cd.major_id = c.id
AND cd.minor_id = c.colid
AND cd.name = 'MS_Description'
join INFORMATION_SCHEMA.COLUMNS sc
on c.name = COLUMN_NAME
and t.name = TABLE_NAME
WHERE t.type = 'u'
ORDER BY t.name

mrt_Azm
دوشنبه 06 خرداد 1392, 12:56 عصر
لطفا کمکم کنید خیلی برام مهمه

mrt_Azm
سه شنبه 14 خرداد 1392, 23:17 عصر
اساتید محترم SQL کمک کنید لطفا

benyaminrahimi
چهارشنبه 15 خرداد 1392, 10:23 صبح
این کدی که براتون میزارم تمام فیلد های دیتابس رو پیدا و ایجاد میکنه و در صورت وجود تغییر میده ... اگه نوع داده تغییر یافته از یک کلاس باشه نیازی به تغییر view ها نیست مثلا Int به Money ولی اگه نوع فیلد تغییر کنه باید ویو ها هم تغییر و مجددا script شن که اسکریپت کردن Object ها مثل ویو و فاکنشن و استوردپروسیجر بحث دیگه ای هست ... پیشنهاد میکنم در این جور مواقع که کلاس متغییره فیلد قبلی دراپ بشه ... تکه کدی که میبینید بخشی از پترن update نرم افزار سگال هست


IF EXISTS (
SELECT *
FROM tempdb.dbo.sysobjects
WHERE id = OBJECT_ID(N'[tempdb].[dbo].[#fielder]')
)
DROP TABLE [dbo].#fielder

CREATE TABLE #fielder
(
sc VARCHAR(MAX) NOT NULL
)
DECLARE @IS_NULLABLE VARCHAR(50)
DECLARE @TABLE_NAME VARCHAR(1000)
DECLARE @COLUMN_NAME VARCHAR(1000)
DECLARE @DATA_TYPE VARCHAR(1000)
DECLARE @cmt VARCHAR(MAX)
DECLARE @befcmt VARCHAR(MAX)
DECLARE @elsecmt VARCHAR(MAX)
DECLARE @CHARACTER_MAXIMUM_LENGTH BIGINT
DECLARE @COLLATION_NAME VARCHAR(1000)

DECLARE filder CURSOR
FOR
SELECT IS_NULLABLE,
TABLE_NAME,
COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name IN (SELECT NAME
FROM sys.Tables
WHERE NAME NOT IN ('sysdiagrams', 'dtproperties'))

OPEN filder
FETCH NEXT FROM filder INTO @IS_NULLABLE,@TABLE_NAME,@COLUMN_NAME,@DATA_TYPE,@ CHARACTER_MAXIMUM_LENGTH ,
@COLLATION_NAME
WHILE @@FETCH_STATUS = 0
BEGIN
IF @IS_NULLABLE = 'YES'
SET @IS_NULLABLE = ' null '

IF @IS_NULLABLE = 'NO'
SET @IS_NULLABLE = ' not null '

SET @befcmt = 'IF not EXISTS( SELECT * FROM INFORMATION_SCHEMA.COLUMNS '
+ ' WHERE TABLE_NAME = ' + '''' + @TABLE_NAME + ''''
+ ' AND COLUMN_NAME = ' + '''' + @COLUMN_NAME + ''''
+ ') begin '


SET @cmt = ''
IF @DATA_TYPE = 'int'
OR @DATA_TYPE = 'bigint'
OR @DATA_TYPE = 'money'
OR @DATA_TYPE = 'float'
OR @DATA_TYPE = 'bit'
OR @DATA_TYPE = 'image'
OR @DATA_TYPE = 'smallint'
SET @cmt = ' alter table [' + @TABLE_NAME + '] add [' +
@COLUMN_NAME + '] ' + @DATA_TYPE + @IS_NULLABLE


IF @DATA_TYPE = 'varchar'
OR @DATA_TYPE = 'nvarchar'
SET @cmt = ' alter table [' + @TABLE_NAME + '] add [' +
@COLUMN_NAME + '] ' + @DATA_TYPE + '(' +
CAST(@CHARACTER_MAXIMUM_LENGTH AS VARCHAR(200)) + ') COLLATE ' +
@COLLATION_NAME + @IS_NULLABLE

IF @DATA_TYPE = 'uniqueidentifier'
SET @cmt = ' alter table [' + @TABLE_NAME + '] add [' +
@COLUMN_NAME +
'] uniqueidentifier not null rowguidcol unique default (newid())'



IF @DATA_TYPE = 'VARBINARY'
SET @cmt = 'if exists( SELECT * FROM sys.filegroups WHERE [name]=' +
'''' +
'filer' + '''' + ') '
+ ' alter table [' + @TABLE_NAME + '] add '
+ '[' + @COLUMN_NAME + '] ' + @DATA_TYPE + '(MAX) filestream ' + @IS_NULLABLE


SET @elsecmt=''

IF @DATA_TYPE = 'int'
OR @DATA_TYPE = 'bigint'
OR @DATA_TYPE = 'money'
OR @DATA_TYPE = 'float'
OR @DATA_TYPE = 'bit'
OR @DATA_TYPE = 'image'
OR @DATA_TYPE = 'smallint'
SET @elsecmt = ' end else begin alter table [' + @TABLE_NAME + '] ALTER COLUMN [' +
@COLUMN_NAME + '] ' + @DATA_TYPE + @IS_NULLABLE


IF @DATA_TYPE = 'varchar'
OR @DATA_TYPE = 'nvarchar'
SET @elsecmt = ' end else begin alter table [' + @TABLE_NAME + '] ALTER COLUMN [' +
@COLUMN_NAME + '] ' + @DATA_TYPE + '(' +
CAST(@CHARACTER_MAXIMUM_LENGTH AS VARCHAR(200)) + ') COLLATE ' +
@COLLATION_NAME + @IS_NULLABLE

SET @cmt=@cmt+@elsecmt
IF @cmt <> ''
INSERT INTO #fielder
(
sc
)
SELECT @befcmt + @cmt + ' end '

FETCH NEXT FROM filder INTO @IS_NULLABLE,@TABLE_NAME,@COLUMN_NAME,@DATA_TYPE,
@CHARACTER_MAXIMUM_LENGTH ,
@COLLATION_NAME
END
CLOSE filder
DEALLOCATE filder

SELECT *
FROM #fielder f