我有以下情況:我正在處理數據庫中包含數百個表的項目,並且我經常知道需要爲哪個表生成腳本,但是在列表中找到它所有表格都需要很長時間。我想知道,有沒有辦法編寫腳本來生成表格的腳本。由於我已經知道表名,所以輸入它比在類似名稱的大列表中搜索它更容易。用於爲表格生成腳本的SQL服務器腳本
3
A
回答
1
是的,你絕對可以編寫自己的程序來生成,這將作爲參數提供給定的表名的腳本。在我的例子,我路過「dbo.TABLE1」作爲參數傳遞給這個查詢: (你可以用這個到存儲過程中,當然)
DECLARE
@object_name SYSNAME = 'dbo.TABLE1'
, @object_id INT = object_id('dbo.TABLE1')
, @SQL NVARCHAR(MAX)
SELECT
@object_name = '[' + OBJECT_SCHEMA_NAME(o.[object_id]) + '].[' + OBJECT_NAME([object_id]) + ']'
, @object_id = [object_id]
FROM (SELECT [object_id] = @object_id) o
SELECT @SQL = 'CREATE TABLE ' + @object_name + CHAR(13) + '(' + CHAR(13) + STUFF((
SELECT CHAR(13) + ' , [' + c.name + '] ' +
CASE WHEN c.is_computed = 1
THEN 'AS ' + OBJECT_DEFINITION(c.[object_id], c.column_id)
ELSE
CASE WHEN c.system_type_id != c.user_type_id
THEN '[' + SCHEMA_NAME(tp.[schema_id]) + '].[' + tp.name + ']'
ELSE '[' + UPPER(tp.name) + ']'
END +
CASE
WHEN tp.name IN ('varchar', 'char', 'varbinary', 'binary')
THEN '(' + CASE WHEN c.max_length = -1
THEN 'MAX'
ELSE CAST(c.max_length AS VARCHAR(5))
END + ')'
WHEN tp.name IN ('nvarchar', 'nchar')
THEN '(' + CASE WHEN c.max_length = -1
THEN 'MAX'
ELSE CAST(c.max_length/2 AS VARCHAR(5))
END + ')'
WHEN tp.name IN ('datetime2', 'time2', 'datetimeoffset')
THEN '(' + CAST(c.scale AS VARCHAR(5)) + ')'
WHEN tp.name = 'decimal'
THEN '(' + CAST(c.[precision] AS VARCHAR(5)) + ',' + CAST(c.scale AS VARCHAR(5)) + ')'
ELSE ''
END +
CASE WHEN c.collation_name IS NOT NULL AND c.system_type_id = c.user_type_id
THEN ' COLLATE ' + c.collation_name
ELSE ''
END +
CASE WHEN c.is_nullable = 1
THEN ' NULL'
ELSE ' NOT NULL'
END +
CASE WHEN c.default_object_id != 0
THEN ' CONSTRAINT [' + OBJECT_NAME(c.default_object_id) + ']' +
' DEFAULT ' + OBJECT_DEFINITION(c.default_object_id)
ELSE ''
END +
CASE WHEN cc.[object_id] IS NOT NULL
THEN ' CONSTRAINT [' + cc.name + '] CHECK ' + cc.[definition]
ELSE ''
END +
CASE WHEN c.is_identity = 1
THEN ' IDENTITY(' + CAST(IDENTITYPROPERTY(c.[object_id], 'SeedValue') AS VARCHAR(5)) + ',' +
CAST(IDENTITYPROPERTY(c.[object_id], 'IncrementValue') AS VARCHAR(5)) + ')'
ELSE ''
END
END
FROM sys.columns c WITH(NOLOCK)
JOIN sys.types tp WITH(NOLOCK) ON c.user_type_id = tp.user_type_id
LEFT JOIN sys.check_constraints cc WITH(NOLOCK)
ON c.[object_id] = cc.parent_object_id
AND cc.parent_column_id = c.column_id
WHERE c.[object_id] = @object_id
ORDER BY c.column_id
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 7, ' ') +
ISNULL((SELECT '
, CONSTRAINT [' + i.name + '] PRIMARY KEY ' +
CASE WHEN i.index_id = 1
THEN 'CLUSTERED'
ELSE 'NONCLUSTERED'
END +' (' + (
SELECT STUFF(CAST((
SELECT ', [' + COL_NAME(ic.[object_id], ic.column_id) + ']' +
CASE WHEN ic.is_descending_key = 1
THEN ' DESC'
ELSE ''
END
FROM sys.index_columns ic WITH(NOLOCK)
WHERE i.[object_id] = ic.[object_id]
AND i.index_id = ic.index_id
FOR XML PATH(N''), TYPE) AS NVARCHAR(MAX)), 1, 2, '')) + ')'
FROM sys.indexes i WITH(NOLOCK)
WHERE i.[object_id] = @object_id
AND i.is_primary_key = 1), '') + CHAR(13) + ');'
SELECT @SQL
0
這裏是一個存儲過程代碼的鏈接,你可以添加和執行只需要表名來獲得DDL。
相關問題
- 1. SQL腳本生成SQL腳本
- 2. 從表生成sql腳本
- 3. 生成SQL腳本
- 4. 用於查找表依賴關係的SQL服務器腳本
- 5. 生成等效於Transact SQL的腳本
- 6. 生成觸發器的SQL腳本
- 7. 從excel表生成Oracle PL/SQL腳本
- 8. 生成腳本
- 9. 暫停SQL服務器腳本?
- 10. SQL Server腳本服務器錯誤
- 11. SQL服務器腳本嚮導
- 12. 轉換SQL服務器腳本到MySQL
- 13. sqlite diff腳本生成器
- 14. 牆生成器腳本
- 15. 要創建一個用於爲DB2表生成表架構的SQL腳本
- 16. SQL服務器將整個錶轉換爲腳本?
- 17. Node.js用於本地服務器端腳本調用的Axios
- 18. 用於在Google表格腳本編輯器中對齊文本的腳本
- 19. 替代服務器類用於執行SQL腳本
- 20. SQL Server CE:使用腳本生成DB
- 21. 爲索引列表生成CREATE腳本
- 22. 服務器升級腳本
- 23. 性能服務器腳本
- 24. 跨服務器Java腳本
- 25. 後端服務器腳本
- 26. JPA腳本生成複製腳本
- 27. GMF腳本生成
- 28. 生成腳本[ORACLE]
- 29. slideToggle()腳本生成
- 30. 爲測試服務器創建腳本
展鵬有一個免費的SQL搜索工具,可以讓你搜索當你從搜索結果中選擇對象時,將會拉起數據庫對象定義http://www.red-gate.com/products/sql-development/sql-search/ – mallan1121
如果你真的可以在對象瀏覽器中使用過濾功能需要。只需右鍵單擊「表」並選擇過濾器 - >過濾器設置。 FWIW我感覺你的痛苦。我有一個很痛苦的系統。在老式RPG系統中有超過4000張桌子和名字開始,所以每張桌子都有6個字符的名字,都是大寫字母。 –
請在DBA Stack Exchange站點上查看此問題/答案:http://dba.stackexchange.com/questions/53085/is-there-a-way-to-generate-table-create-script-in-tsql –