Truy vấn trong SQL?

Chia sẻ bởi:hands
★★★★★
Quảng cáo

Xin chào các bạn.
OT chạy câu lệnh sau:

SELECT
    sc.name + '.' + ta.name TableName,
    SUM(pa.rows) RowCnt
FROM
    sys.tables ta
INNER Join
    sys.partitions pa
ON
    pa.OBJECT_ID = ta.OBJECT_ID
INNER Join
    sys.Schemas sc
ON
    ta.schema_id = sc.schema_id
WHERE
    ta.is_ms_shipped = 0
AND
    pa.index_id IN (1,0)
Group BY
    sc.name,
    ta.name
Order BY
    Sum (pa.Rows)
DESC

Kết quả trả về tên bảng và số dòng của bảng và sắp xếp giảm giần theo cột số dòng trong bảng.

SELECT
    TABLE_NAME,
COLUMN_NAME
FROM
     INFORMATION_SCHEMA.Columns

Kết quả trả về tên bảng và tên các cột trong bảng.

Xin hỏi có câu lệnh nào để trả về 3 dữ liệu: tên bảng, tên cột trong bảng, số dòng trong cột?

"Số dòng trong cột" là như thê nào nhỉ?
thường thì mình nói về số dòng của bảng, vì ô mà không có dữ liệu (NULL) thì vẫn là một ô.

Cái này là tư duy của range, bảng trong excel-vba nên bỏ đi
Khi đã quan niệm là theo Cơ sở dữ liệu – thì đối tượng quan tâm chính nên là Data (dữ liệu) và đối tượng xử lý là table, field, recordset, … và Relationship…

Schema là metadata.
Xáo trộn giữa metadata và data là công việc của data manager hoặc desinger.
Đây là công việc cao cấp. Thường thì sau khi hệ thống phần mềm đưa vào hoạt động cỡ 1 năm (hay 6 tháng, tuỳ theo độ lớn) thì data designer sẽ bắt đầu lập thống kê dữ liệu để hiệu chỉnh lại metadata.
Như đã nói, làm công việc này là hàng cao cấp cho nên ông nội tôi cũng không dám xía vào. Công việc không phải chỉ viết 1 cái sp rồi đọc kết quả. Từ khoá ở đây là "hiệu chỉnh".

Xin chào anh Bình,

Đúng rồi thường là sẽ nói về số dòng của bảng bảng cột nào nhiều dòng nhất thì sẽ lấy số dòng của cột đó.
Ở đây OT muốn lấy dữ liệu của các ô có dữ liệu của các cột trong bảng như minh họa ảnh kèm bên dưới ạ.

Mục đích cũng chỉ là hỏi để xem có câu lệnh này không?
Và OT muốn sử dụng câu lệnh này để kiểm tra thông tin thôi ạ.
Mong anh và mọi người xem giúp ạ.

[ATTACH type="full" alt="Untitled (2).jpg"]2503

Theo như hình của bạn, thông tin vừa lấy từ các table hệ thống vừa truy vấn số dòng NOT NULL trong từng table riêng nên tôi nghĩ là không có cách join các table để lấy thông tin trực tiếp như bạn yêu cầu mà phải dùng cách đi vòng: tạo table tạm lưu thông tin (Tên bảng, Tên Cột, Ô có dữ liệu) rồi mới cập nhật dữ liệu vào table này. Các bạn chuyên về SQL Server có cách khác thì hỗ trợ giùm nhé.

Cách tôi làm như sau: Vì bạn chủ yếu muốn thống kế nên tôi làm kiểu thủ công trực tiếp trong SQL Server nhé.

1. Tạo table tạm:

USE NORTHWIND --Đổi tên Database của bạn.
GO
CREATE TABLE myDBInfo (
    TblName VARCHAR(30),
    ColName VARCHAR(30),
    NumRow INT
);

2. Insert dữ liệu từ INFORMATION_SCHEMA.COLUMNS vào table tạm:

USE NORTHWIND
GO
INSERT INTO myDBInfo SELECT TABLE_NAME, COLUMN_NAME,0 FROM INFORMATION_SCHEMA.COLUMNS

3. Tạo các stored proc. (SP) để thực thi việc cập nhật dữ liệu: tạo 2 SP

– SP: UpdatemyDBInfoTbl

USE [NORTHWIND]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[UpdatemyDBInfoTbl]
@TName nvarchar(30),
@CName nvarchar(30)
AS
BEGIN
SET NOCOUNT ON;
Declare @sql nvarchar(300);
    Set @sql='UPDATE myDBInfo SET NumRow = (SELECT count(*) FROM ' +  @TName + ' WHERE ' + @CName + ' Is Not Null) WHERE myDBInfo.TblName =''' + @TName + ''' AND myDBInfo.ColName =''' + @CName + ''''
    EXEC sp_executesql @sql
    --print @sql
END

– SP: GetNumRowNotNull

USE [NORTHWIND]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[GetNumRowNotNull]

AS
BEGIN
declare @TName varchar(30)
Declare @CName varchar(30)
declare cur CURSOR LOCAL for
    select TblName, ColName from myDBInfo

open cur

fetch next from cur into @TName, @CName

while @@FETCH_STATUS = 0 BEGIN
--print @TName
--print  @CName
    --Chạy Store Proc. cho từng dòng

exec dbo.UpdatemyDBInfoTbl @TName, @CName

fetch next from cur into @TName, @CName

END

close cur
deallocate cur
END

==> Xong. Bây giờ chạy lệnh thực thi SP trên.

Exec sp_executesql GetNumRowNotNull

Và xem kết quả:

select * from mydbinfo

2504

– Trong Excel bạn dùng ADO Command để gửi lệnh yêu cầu SQL Server thực thi cái stored proc. "GetNumRowNotNull".
– Sau đó bạn dùng ADO Recordset để lấy dữ liệu từ table "myDbInfo" về Excel sheet như cách bạn đang làm.
– Một cái quan trọng để tránh lỗi cho cái SP trong SQL server là đặt tên Table, tên Field không có khoảng trắng nhé.

www.giaiphapexcel.com/diendan/threads/truy-v%E1%BA%A5n-trong-sql.143453/

Thiết kế Tổng đãi ngộ (Total Rewards) theo khung SHRM
Khóa học SprinGO phù hợp

Thiết kế Tổng đãi ngộ (Total Rewards) theo khung SHRM

Khóa học “Thiết kế Tổng phần thưởng (Total Reward) chuẩn khung SHRM” giúp bạn nắm vững toàn bộ hệ thống đãi ngộ theo chuẩn...

Xem khóa học
★★★★★ 5 ★ 1 👤 30 ▥ 0
Quảng cáo

Bạn nên đọc

Bình luận

Quảng cáo

Cũ vẫn chất

Xem thêm