2012-04-20 25 views
5

I Want to trở lại Tất cả các tên bảng từ một cơ sở dữ liệu sử dụng nhưng điều này chỉ trả lại một charkịch bản vấn đề Transact-SQL

declare @contador int 

set @contador = 1 

while (@contador<=(select count(table_name) from INFORMATION_SCHEMA.TABLES)) 
begin 
declare @tableName varchar 
    set @tableName = (select top 1 * from (select top(@contador) table_name from INFORMATION_SCHEMA.TABLES order by table_name asc) as nombre order by table_name desc) 
    print @tableName 
    set @contador = @contador + 1 
end 

đầu ra là s s s s s s

+2

Nếu bạn khai báo biến là VARCHAR, bạn thực sự khai báo VARCHAR (1). Hãy thử VARCHAR (64) hoặc một cái gì đó để thay thế. – MatBailie

+2

Tại sao 'chọn top 2 table_name từ INFORMATION_SCHEMA.TABLES theo thứ tự table_name asc' không đủ tốt? – Oded

+0

@Oded: Bạn không thể 'PRINT' một tập hợp kết quả. Bạn có thể muốn in một tên bảng hơn là chọn nó nếu bạn đang viết một kịch bản tạo ra một kịch bản khác như đầu ra. –

Trả lời

3
declare @tableName varchar(100) 

Bạn cần phải xác định độ dài của @tableName, theo mặc định nó được đặt thành 1 ký tự.

+0

nhờ người đàn ông đơn giản và khách quan – BlaShadow

+0

@BlaShadow bạn được chào đón :) –

+0

Thao tác này sẽ cắt bớt tên bảng dài hơn 100 ký tự và sẽ không hỗ trợ các ký tự bên ngoài trang mã hiện tại. Xem câu trả lời của tôi cho một thay thế. –

1

thử declare @tableName varchar(100)

+3

Điều này khác với câu trả lời ở đây trước câu trả lời của bạn theo cách nào? Bạn đã thêm từ * Thử * lúc bắt đầu? WOOT! – MatBailie

+1

Câu hỏi đơn giản, câu trả lời đơn giản. Bạn gõ của bạn vào, gửi nó, và thấy rằng ba người đánh bại bạn bằng một phút hoặc ít hơn. Xảy ra mọi lúc. –

+0

Chính xác những gì Philip nói. – JBrooks

1

Bạn cần thay đổi tablename của bạn để có một giá trị cho số ký tự. Hiện tại giá trị đó được mặc định là một. Tôi sẽ đề nghị một giá trị lớn hơn nhiều so với bạn nghĩ rằng bạn neeed để đảm bảo rằng tất cả các bảng phù hợp với bên trong lĩnh vực này.

1

declare @tableName varchar nhu cầu phải có một kích thước như varchar(50)

1

T-SQL có loại SYSNAME để lưu trữ những thứ như tên bảng:

Các kiểu dữ liệu SysName được sử dụng cho các cột của bảng, các biến, và lưu trữ tham số thủ tục lưu trữ tên đối tượng. Định nghĩa chính xác của sysname có liên quan đến các quy tắc cho số nhận dạng. Do đó, nó có thể thay đổi giữa các phiên bản của SQL Server. sysname có chức năng giống nhau như nvarchar (128) ngoại trừ, theo mặc định, sysname là NOT NULL. Trong phiên bản trước của SQL Server, sysname được định nghĩa là varchar (30).

Vì vậy, cố gắng tuyên bố biến của bạn như thế này:

DECLARE @tableName SYSNAME; 

Sử dụng tờ khai VARCHAR(100), như đề xuất trong câu trả lời khác, sẽ thất bại nếu các tên bảng chứa các ký tự bên ngoài trang mã hiện tại của bạn hoặc dài hơn 100 nhân vật.

trích đoạn này từ SQL Server rules for identifiers mô tả dưới dạng một tên bảng:

  1. Ký tự đầu tiên phải là một trong những điều sau đây:

    • Một lá thư theo quy định của Tiêu chuẩn Unicode 3.2. Định nghĩa của các chữ cái Unicode bao gồm các ký tự La tinh từ a đến z, từ Từ A đến Z và cũng có các ký tự chữ cái từ các ngôn ngữ khác.

    • Dấu gạch dưới (_), tại ký hiệu (@) hoặc ký hiệu số (#).

    • Một số ký hiệu ở đầu số nhận dạng có ý nghĩa đặc biệt trong SQL Server. Số nhận dạng thông thường bắt đầu bằng dấu tại luôn biểu thị biến hoặc tham số cục bộ và không được sử dụng làm tên của bất kỳ loại đối tượng nào khác. Số nhận dạng bắt đầu bằng dấu số biểu thị bảng hoặc thủ tục tạm thời.Số nhận dạng bắt đầu bằng các dấu hiệu số kép (##) biểu thị đối tượng tạm thời toàn cầu . Mặc dù ký hiệu số hoặc ký hiệu số kép có thể được sử dụng để bắt đầu tên của các loại đối tượng khác, chúng tôi không đề nghị thực hành này.

    • Một số hàm Transact-SQL có tên bắt đầu bằng dấu hai chấm tại dấu (@@). Để tránh nhầm lẫn với các chức năng này, bạn không nên sử dụng các tên bắt đầu bằng @@.

  2. ký tự tiếp theo có thể bao gồm những điều sau đây:

    • Letters theo quy định tại Tiêu chuẩn Unicode 3.2.

    • Số thập phân từ tập lệnh Basic Latin hoặc các tập lệnh quốc gia khác.

    • Dấu tại, ký hiệu đô la ($), ký hiệu số hoặc dấu gạch dưới.

  3. Mã định danh không được là từ dành riêng cho Transact-SQL. SQL Server bảo lưu cả chữ hoa và chữ thường của các từ dành riêng.

  4. Không gian được nhúng hoặc ký tự đặc biệt không được phép.

  5. Các ký tự bổ sung không được phép.

Xem liên kết tài liệu trong câu trả lời của tôi để biết thêm thông tin.

+0

đó là một câu trả lời hay nhưng tôi không biết tại sao nhưng chậm hơn – BlaShadow

+0

Loại NVARCHAR sử dụng hai byte để biểu diễn mỗi ký tự, và kiểu VARCHAR sử dụng một byte để lưu trữ mỗi ký tự. Nếu bạn đang xử lý một khối lượng lớn dữ liệu văn bản, bạn có thể nhận thấy các hoạt động chuỗi sử dụng kiểu NVARCHAR mất nhiều thời gian hơn các phép toán VARCHAR tương đương. Khó nói chắc chắn mà không thấy dữ liệu bạn đang làm việc. –

Các vấn đề liên quan