2012-06-27 104 views
9

Tôi cần sử dụng exec bên trong mệnh đề select. Truy vấn cho exec được tạo ra theo các cột của bảng để chọn mệnh đề select nếu được sử dụng. Những gì tôi muốn làm là một cái gì đó như sau:Sử dụng EXEC bên trong câu lệnh SELECT trong SQL Server

SELECT distinct 
    MTMain.[TableName], 
    MTMain.[TableFKey], 
    (select IsActive (exec GetStringForIsActive MTMain.[TableName],MTMain.[TableFKey])) 
FROM 
    [MasterTableForLanguage] MTMain 

Ở đây, GetStringForIsActive là thủ tục lưu trữ Tôi muốn thực hiện cho mỗi hàng được lựa chọn từ MasterTableForLanguage.
Các stored procedure sẽ sử dụng EXEC để thực hiện chuỗi sau

select IsActive from [TableName] where PKID= cast([TableFKey] as int) 

TableName và TableFKey sẽ đầu vào của thủ tục lưu trữ.

+4

bạn nên sử dụng chức năng thay vì thủ tục lưu trữ nếu bạn muốn sử dụng chúng trong chọn khoản – Boomer

+0

bài viết proc của bạn. Tôi không biết những gì bạn làm bên trong proc, có thể bạn có thể thay đổi nó thành một chức năng hoặc thậm chí tốt hơn giải quyết nó như subselects. – YvesR

+0

Tôi đang sử dụng quy trình được lưu trữ để thực hiện chuỗi. Tôi cần phải làm điều đó theo cách này bởi vì tôi cần phải sử dụng cột [TableName] như bảng và kiểm tra xem giá trị [TableFKey] thoát trong cột cụ thể của bảng đó. –

Trả lời

3

sử dụng các hàm thay vì các thủ tục được lưu trữ trong mệnh đề SELECT.

được sửa đổi:

tạo ra rằng chức năng

CREATE FUNCTION function1 (@TableName nvarchar(10),@TableFKey nvarchar(10)) 
RETURNS nvarchar(100) AS 
BEGIN 
    -- do whatever here 
END 

sau đó

SELECT distinct 
    MTMain.[TableName], 
    MTMain.[TableFKey], 
    function1(MTMain.[TableName],MTMain.[TableFKey]) 
FROM 
    [MasterTableForLanguage] MTMain 

Liệu điều này làm cho ý nghĩa?

+1

Có nhiều thứ không thể thực hiện được trong một chức năng có thể được thực hiện trong một proc mặc dù. –

+1

bạn vẫn không thể gọi thủ tục được lưu trữ từ chức năng. cố gắng chuyển đổi thủ tục lưu trữ của bạn thành một hàm – Boomer

+1

Tôi cần sử dụng EXEC bên trong hàm. kiểm tra bình luận của tôi về câu hỏi. –

1

Nếu bạn có thể sửa đổi thủ tục lưu trữ GetStringForIsActive để trả về TableName, TableFKey và IsActive, bạn có thể sử dụng con trỏ để thực thi nó cho mỗi hàng và thêm kết quả vào bảng tạm thời.

ví dụ:

exec GetStringForIsActive 'TableName', 'TableFKey' 
returns 
select [TableName], [TableFKey], IsActive from [TableName] where PKID= cast([TableFKey] as int) 

Mã này sẽ là như thế này:

declare @TableName nvarchar(50) 
declare @TableFKey nvarchar(50) 
declare @Results table (TableName nvarchar(50), TableFKey nvarchar(50), IsActive bit) 

declare TableCursor cursor fast_forward for 
    select TableName, TableFKey from MasterTableForLanguage 

open TableCursor 

fetch next from TableCursor into @TableName, @TableFKey 

if @@FETCH_STATUS <> -1 
    print 'MasterTableForLanguage check' 

while (@@FETCH_STATUS <> -1) 
begin 


    insert into @Results 
    exec GetStringForIsActive @TableName, @TableFKey 

    fetch next from TableCursor into @TableName, @TableFKey 

end 
close TaleCursor 
deallocate TableCursor 

select * from @Results 
0

Vâng, tôi nghĩ để trả lời câu hỏi đầy đủ, tôi không tin rằng một thủ tục lưu trữ sẽ Exec một câu lệnh SELECT , nó chỉ đơn giản là thực hiện SELECT.

Bạn EXEC proc hiện tại của bạn và vượt qua nó vars, và nó trả về một giá trị DỰA TRÊN lệnh chọn nó chạy. Nó không phải là EXEC'ing tuyên bố đó, chỉ cần thực hiện một lựa chọn. Tôi có một số procs lưu trữ tôi sử dụng hàng ngày trong một số quy trình đại lý SQL, tất cả họ thực hiện lựa chọn để truy vấn các bảng khác nhau, và không ai trong số họ gọi EXEC để thực hiện những hành động đó. Đây là ví dụ của riêng tôi:

CREATE PROCEDURE [myproc] 
    @job_ident  INT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    ... 

    SELECT TOP(1) @filter_type = filter_type FROM [place] WHERE [ident] = @job_ident 

    ... 
END 

Như đã đề cập trước đó, cách hiệu quả nhất để thực hiện truy vấn của bạn sẽ được thực hiện mà chọn bên trong một hàm, một cái gì đó tương tự như này tôi nghĩ sẽ làm:

CREATE FUNCTION ThisFunction (
    @TableName nvarchar(10), 
    @TableFKey nvarchar(10) 
    ) 
    RETURNS nvarchar(100) 
    AS 
     BEGIN 
      RETURN 
      (
       select IsActive from [TableName] where PKID= cast([TableFKey] as int) 
      ) 
     END 

sau đó bạn có thể thực hiện chính xác như bạn muốn ...

SELECT distinct 
    MTMain.[TableName], 
    MTMain.[TableFKey], 
    ThisFunction(MTMain.[TableName],MTMain.[TableFKey]) 
FROM 
    [MasterTableForLanguage] MTMain 
Các vấn đề liên quan