PDA

View Full Version : cho hoi ve Stored Procedures



Bacmaon
18-03-2004, 15:45
Bà con ơi cho hỏi thăm chút: Khi viết các đoạn mã trong Stored Procedures thì mình có thể dịch nó ra (giống như dịch ra EXE) được không Bà con ? , chứ lẽ nào khi đưa CSDL qua máy khác thì nó vẫn "hiện nguyên hình" trơ trơ như thế nhỉ ?
Vãn bối xin Thank!

past_beggar
20-03-2004, 06:53
Kô . Cấu trúc câu lệnh SQL ở các database là khác nhau . Bạn bê nguyên SQL của SQLServer sang Oracle chết ngỏm củ tỏi lun . Thân :D , quá trình convert khoai vãi đấi :(

Há há, Búa hỉu nhầm ý rùi, họ hỏi là dịch cái sờ (cái gì ) to ấy cơ.
Không có đâu, Muốn đọc cái sờ to đấy phải có quyền truy cập Database, mà Database ở trên máy chủ xa tít tắp đâu đó, ở đó chỉ có một vài người quản trị thôi, hay là tránh nốt mấy người quản trị DB

To Bacmaon: Triển khai quả sản phẩm nào dùng Oracle hay SQL Server bao giờ chưa, kiến trúc chương trình như thía nào??

ptran
20-03-2004, 09:24
thêm "with encryption" vô trong store procedure . Nhớ giữ bản gốc lại nếu không sẽ bị mất hết .

past_beggar
20-03-2004, 11:00
thêm "with encryption" vô trong store procedure . Nhớ giữ bản gốc lại nếu không sẽ bị mất hết .
Theo ngu học của tôi thì làm *** gì có cái từ khoá này, phải mua một cái Tools bên ngoài đàng hoàng mới được thì phải.
Không chắc chắn lắm vì lần trước có down về một con Tools để mã hoá stored kiểu kiều này mà chưa dùng.

Nếu đúng thì vỗ tay, sai thì mong mọi người chỉ giáo

Bacmaon
23-03-2004, 03:43
Mình cũng có ý là "tránh nốt mấy người quản trị DB", nhưng theo mấy Huynh nói vậy là chắc mình phải để nó "Hiện nguyên hình" rồi !,Cảm ơn các Huynh đã chỉ giáo !

Ali33n40Girls
24-03-2004, 01:27
Theo ngu học của tôi thì làm *** gì có cái từ khoá này, phải mua một cái Tools bên ngoài đàng hoàng mới được thì phải.
Không chắc chắn lắm vì lần trước có down về một con Tools để mã hoá stored kiểu kiều này mà chưa dùng.

Nếu đúng thì vỗ tay, sai thì mong mọi người chỉ giáo
:confused: :confused:

Đây là phần trích ra từ Online Books đi kèm với SQL Server 2000


Syntax
CREATE PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]

[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

[ FOR REPLICATION ]

AS sql_statement [ ...n ]


và đây là phần giải thích cho WITH ENCRYPTION


RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}

RECOMPILE indicates that SQL Server does not cache a plan for this procedure and the procedure is recompiled at run time. Use the RECOMPILE option when using atypical or temporary values without overriding the execution plan cached in memory.

ENCRYPTION indicates that SQL Server encrypts the syscomments table entry containing the text of the CREATE PROCEDURE statement. Using ENCRYPTION prevents the procedure from being published as part of SQL Server replication.

Note During an upgrade, SQL Server uses the encrypted comments stored in syscomments to re-create encrypted procedures.


Đây là đoạn code đơn giản cho một SP được mã hóa



CREATE PROCEDURE TestEncrypteđSP WITH ENCRYPTION
AS
PRINT 'TEST ENCRYPTED STORE PROCEĐURE'

ptran
24-03-2004, 02:49
Ali33n40Girls,

Thanks.
Từ lâu, tôi đã tu không trả lời những câu như vậy nữa :) ... già rồi, sợ lên huyết áp lắm .

Bacmaon
29-03-2004, 11:53
Các Bác ơi, nhờ các Bác cứu với, mình đang viết 1 cái Stored Pro như thế lày:

CREATE PROCEDURE INSERT_DL(@TABNAME NVARCHAR(25),@MA CHAR(2),@TEN NVARCHAR(25),@DONGIA FLOAT,@SOLUONG INT,@TGIAN DATETIME) AS
DECLARE @chuoi NVARCHAR(200)

set @chuoi='INSERT INTO ' + @TABNAME + ' VALUES(' + @MA + ',' + @TEN + ',' + @DONGIA + ',' + @SOLUONG + ',' + @TGIAN + ')'
exec(@chuoi)
GO
trong đó các trường có kiểu dữ liệu tương ứng, tên bảng do người dùng truyền vào.
và trong VB mình Exec như sau
Conn.Execute "INSERT_DL'" & tenbang & "','" & Ma & "','" & Ten & "'," & DGIA & "," & SLUONG & ",'" & Thoigian & "'"

nhưng khi Run chương trình báo lỗi Convert dữ liệu, mình nghĩ mãi nhưng bí, đành phải cầu cứu các Bác, mong các bác niệm tình chỉ giáo !

past_beggar
29-03-2004, 11:58
Nếu báo lỗi thì xem giá trị các tham biến truyền vào là được chứ sao.

bpmtri
29-03-2004, 12:42
Các Bác ơi, nhờ các Bác cứu với, mình đang viết 1 cái Stored Pro như thế lày:

CREATE PROCEDURE INSERT_DL(@TABNAME NVARCHAR(25),@MA CHAR(2),@TEN NVARCHAR(25),@DONGIA FLOAT,@SOLUONG INT,@TGIAN DATETIME) AS
DECLARE @chuoi NVARCHAR(200)

set @chuoi='INSERT INTO ' + @TABNAME + ' VALUES(' + @MA + ',' + @TEN + ',' + @DONGIA + ',' + @SOLUONG + ',' + @TGIAN + ')'
exec(@chuoi)
GO
trong đó các trường có kiểu dữ liệu tương ứng, tên bảng do người dùng truyền vào.
và trong VB mình Exec như sau
Conn.Execute "INSERT_DL'" & tenbang & "','" & Ma & "','" & Ten & "'," & DGIA & "," & SLUONG & ",'" & Thoigian & "'"

nhưng khi Run chương trình báo lỗi Convert dữ liệu, mình nghĩ mãi nhưng bí, đành phải cầu cứu các Bác, mong các bác niệm tình chỉ giáo !

Các tham số dùng nvarchar thì khi bạn gọi phải thêm kí tự N đằng trước. Cụ thể:


Conn.Execute "INSERT_DL N'" & tenbang & "','" & Ma & "',N'" & Ten & "'," & DGIA & "," & SLUONG & ",'" & Thoigian & "'"


Và cũng lưu ý thêm là giá trị thời gian(Thoigian) bạn đưa vào có đúng format chưa?

Bacmaon
29-03-2004, 16:43
Cám ơn Bpmtri nhiều, mình sẽ thử, nhưng hình như nó không phải báo lỗi ở các biến Nvarchar, mà bắt đầu báo lỗi từ biến kiểu Float và kiểu INT, các biến này ở VB mình cũng khai cùng kiểu như thế, lôĩ cụ thể như thế này:

Syntax error Converting the Nvarchar
Value Insert into bang Values(01,tủ,' to a column of data type INT

giúp mình lần nữa nhé !

past_beggar
29-03-2004, 17:44
set @chuoi = 'SET DATEFORMAT DMY ' + ......

bpmtri
30-03-2004, 10:35
CREATE PROCEDURE INSERT_DL(@TABNAME NVARCHAR(25),@MA CHAR(2),@TEN NVARCHAR(25),@DONGIA FLOAT,@SOLUONG INT,@TGIAN DATETIME) AS
DECLARE @chuoi NVARCHAR(200)

set @chuoi='INSERT INTO ' + @TABNAME + ' VALUES(' + @MA + ',' + @TEN + ',' + @DONGIA + ',' + @SOLUONG + ',' + @TGIAN + ')'
exec(@chuoi)
GO


Nếu các cột đơn giá, số lượng là là float và int thì bạn phải sửa lại như sau:


CREATE PROCEDURE INSERT_DL(@TABNAME NVARCHAR(25),@MA CHAR(2),@TEN NVARCHAR(25),@DONGIA FLOAT,@SOLUONG INT,@TGIAN DATETIME) AS
DECLARE @chuoi NVARCHAR(200)

set @chuoi= N'INSERT INTO ' + @TABNAME + ' VALUES(N''' + @MA + N''',N''' + @TEN + ''',' + CONVERT(nvarchar(20),@DONGIA) + ',' + CONVERT(nvarchar(20),@SOLUONG) + N',''' + @TGIAN + N''')'
exec(@chuoi)
GO


Bạn chú ý các ký tự ' đi liền nhau ('''), hàm CONVERT, và chữ N đằng trước (vì bạn đang thao tác với kiểu nvarchar)
1. Một chuỗi nvarchar khi thao tác thì thêm N đằng trước nó. VD: 'công ty' -> N'công ty'
2. Muốn có một ký tự ' trong một chuỗi thì bạn phải double nó lên, nếu không sẽ bị lỗi cú pháp. Ví dụ: muốn có chuỗi Công ty's thì bạn phải viết là N'Công ty''s'
3. Muốn cộng một số vào một chuỗi thì bạn phải dùng hàm CONVERT hoặc CAST để chuyển số thành chuỗi

Bacmaon
30-03-2004, 12:19
Vừa đọc xong mừng lắm, cảm ơn trước đã rùi tính sau! nhưng còn nữa, bạn nói là ký tự N đi trước biến Nvarchar, vậy tại sao có chữ N sau @MA,sau @SOLUONG và sau @TGIAN, nó còn nèm ngoài dấu ' là nghĩa gì zậy ?

phatnq2003
09-04-2004, 16:22
Vừa đọc xong mừng lắm, cảm ơn trước đã rùi tính sau! nhưng còn nữa, bạn nói là ký tự N đi trước biến Nvarchar, vậy tại sao có chữ N sau @MA,sau @SOLUONG và sau @TGIAN, nó còn nèm ngoài dấu ' là nghĩa gì zậy ?

Tôi thấy bạn bpmtri giải thích khá đủ,tuy nhiên hình như bạn bpmtri có dư một chữ N sau @MA. Coi lại coi! :)