PDA

View Full Version : Gán giá trị cho một biến... Help me!



Bacmaon
30-05-2004, 12:27
Mình muốn gán giá trị cho một biến, giá trị này được select từ một trường trong bảng, với tên bảng là một tham số được truyền vào.
ví dụ mình muốn gán giá trị cho biến @MA, tuỳ tên bảng truyền vào, nếu truyền vào tên bảng NHANVIEN thì @MA sẽ lấy giá trị MA trong bảng NHANVIEN, còn nếu tên bảng là KHACHHANG thì @MA sẽ lấy giá trị MA trong bảng KHACHHANG
mình làm như thế này nhưng bị sai, mong các bác chỉ giúp:

CREATE PROCEDURE LINK_CTIET(@TENBANG NVARCHAR(25)) AS
DECLARE @MA NVARCHAR(10)
DECLARE @CHUOI NVARCHAR(100)

SET @CHUOI='SET ' + @MA + ' =(SELECT MA FROM ' + @TENBANG + ' WHERE MA= ' + Char(39) + 'L05' + Char(39) + ')'
EXEC(@CHUOI)

ttn0303
05-06-2004, 11:32
It should be

SET @CHUOI='SET ' + @MA + ' =(SELECT MA FROM ' + @TENBANG + ' WHERE MA= "L05")'
EXEC(@CHUOI)

Bacmaon
05-06-2004, 17:36
thế thì có khác gì đâu ! Char(30) tương đương với dấu nháy đơn ' của bạn, còn nếu bạn dùng dấu nahý kép " thì càng sai trầm trọng

sontinh2004
09-06-2004, 06:19
Try this ...

SET @CHUOI='SET ' + @MA + ' =(SELECT MA FROM ' + @TENBANG + ' WHERE MA= ''L05'')'

EXEC sp_executesql @CHUOI

(sp_executesql also has its own execution plan, which can make your query run faster.)

You can use 2 single quotes (not a double quote) instead of char(39).

Good luck!

sontinh2004
09-06-2004, 06:30
To further explain what was going on (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsqlpro2k/html/sql00g7.asp)

How does the EXEC() function work? It executes the command contained in the variable, but in a different context from the session calling the function. That's important, because it introduces some severe constraints. Any tables you create are visible to the EXEC() context, but variables declared by the calling session aren't visible to the EXEC() context, and vice versa. Therefore the following doesn't work:

DECLARE @MyVar INT
EXEC('SET @MyVar = 3')

The EXEC() session can't see the variable, because it was declared in the calling session. If we stuff it inside the EXEC(), as in the following:

EXEC(' DECLARE @MyVar INT SET @MyVar = 3')

Bacmaon
20-06-2004, 23:24
Cảm ơn các bạn !

phatnq2003
25-06-2004, 23:38
Nếu bạn đang dùng SQL Server 2000 thì hãy tạo một function. Từ đó bạn có thể lấy nó như một hàm thông thường.

CREATE FUNTION fnMyFunc (@tableName varchar(20))
RETURN varchar
AS
BEGIN
-- Cái gì bạn muốn
RETURN result -- kết quả bạn muốn nhận
END

Trong procedure bạn muốn nhận kết quả:

SET @ma = dbo.fnMyFunc(@tableName)