используя две таблицы данных в процедуре SQL - PullRequest
0 голосов
/ 23 июня 2011

Я попал в ситуацию, когда меня заставили создать процедуру, которая использует две таблицы данных, такие как эта:

ALTER PROCEDURE [sesuser].[Login_GetUserList]
(
    @beginsWith NVARCHAR(20) = NULL,
    @SortBy nvarchar(20) = NULL,
    @sortByDirection nvarchar(5) = N'ASC'
)
AS
BEGIN

    DECLARE @searchStr NVARCHAR(21)

    IF @beginsWith IS NULL
        SET @beginsWith = N''
    ELSE
        SET @beginsWith = dbo.SuperTrim(@beginsWith);

    IF LEN(@beginsWith) > 0
        SET @searchStr = @beginsWith + N'%'
    ELSE
        SET @searchStr = N'%'

DECLARE @sqlSTR NVARCHAR(4000)
DECLARE @sqlOffice NVARCHAR(100)
DECLARE @sqlOfficeID NVARCHAR(10)
DECLARE @sqlEndSTR NVARCHAR(4000)

SET @sqlSTR = N' SELECT 
        [SESLoginID] AS LoginID
        ,[SESSuspended] AS LoginSuspended
        ,[SESAdmin] AS Role_Admin
        ,[SESLoginID]
        ,[SESFirstName]
        ,[SESLastName]
        ,[SESEmail]
        ,[SESSuspended]
        FROM sesuser.SESLogin
        WHERE SESFirstName LIKE ''' + @searchStr + ''''

SET @sqlOfficeID = N' SELECT 
        [SESLoginID]
        FROM sesuser.SESLogin
        WHERE SESFirstName LIKE ''' + @searchStr + ''''

SET @sqlOffice = N' SELECT
        [OfficeName]
        FROM sesuser.Office
        WHERE OfficeID LIKE ''' + @sqlOfficeID + ''''

SET @sqlEndSTR = @sqlSTR + @sqlOffice

PRINT @sqlEndSTR

EXEC sp_ExecuteSQL @sqlEndSTR

END

так, как я понимаю, этот код должен быть в офисной таблицеИдентификаторы и эквивалентное Имя офиса, чтобы заменить идентификатор офиса на Имя в другой таблице и вернуть его.

Затем я использую строку извлечения данных в методе в моем коде c #:

public static DataTable GetUserList(string beginsWith, out string errMessage, string sortBy, string sortByDirection)
{
   DataTable dt = null;
   int errNum = 0;
   string sql = "[sesuser].[Login_GetUserList]";
   SqlDataAdapter adap = null;

   SqlParameter param = null;

   errMessage = "";
   SqlConnection conn = Functions.Database.DBConnect(out errNum);

   try
   {
      SqlCommand cmd = new SqlCommand(sql);
      cmd.Connection = conn;
      cmd.CommandType = CommandType.StoredProcedure;

      param = new SqlParameter("@beginsWith", SqlDbType.NVarChar, 40);
      param.Value = string.IsNullOrEmpty(beginsWith) ? "" : beginsWith.Trim();
      cmd.Parameters.Add(param);
      cmd.Parameters.AddWithValue("@SortBy", sortBy);
      cmd.Parameters.AddWithValue("@sortByDirection", sortByDirection);

      adap = new SqlDataAdapter(cmd);

      dt = new DataTable();
      adap.Fill(dt);
   }
   catch (Exception ex)
   {
      errMessage = ex.Message;
   }
   finally
   {
      Functions.Database.DBClose(conn);
   }

   return dt;
}

и позже в своем коде asp.net я перезваниваю бэк-офису

<asp:BoundField DataField="OfficeName" HeaderText="Business Unit" ReadOnly="True"  />

Проблема в том, что он ошибается, говоря, что не может найти OfficeName.

Есть что-то, что я забыл?Или я делаю это неправильно?

Ответы [ 2 ]

1 голос
/ 23 июня 2011

Похоже, ваша хранимая процедура возвращает два подмножества.

Изменить вашу хранимую процедуру следующим образом:

ALTER PROCEDURE [sesuser].[Login_GetUserList]
(   @beginsWith NVARCHAR(20) = NULL,
    @SortBy nvarchar(20) = NULL,
    @sortByDirection nvarchar(5) = N'ASC')
AS
BEGIN    
    DECLARE @searchStr NVARCHAR(21)    
    IF @beginsWith IS NULL
        SET @beginsWith = N''
    ELSE
        SET @beginsWith = dbo.SuperTrim(@beginsWith);    
    IF LEN(@beginsWith) > 0
        SET @searchStr = @beginsWith + N'%'
    ELSE
        SET @searchStr = N'%'    
DECLARE @sqlSTR NVARCHAR(4000)    
SET @sqlSTR = N' SELECT 
         [OfficeName]
        ,[SESLoginID] AS LoginID
        ,[SESSuspended] AS LoginSuspended
        ,[SESAdmin] AS Role_Admin
        ,[SESLoginID]
        ,[SESFirstName]
        ,[SESLastName]
        ,[SESEmail]
        ,[SESSuspended]
        FROM sesuser.SESLogin
        INNER JOIN sesuser.Office
        ON sesuser.Office.OfficeID = sesuser.SESLogin.SESLoginID
        WHERE SESFirstName LIKE ''' + @searchStr + ''''    
PRINT @sqlSTR    
EXEC sp_ExecuteSQL @sqlSTR    
END
0 голосов
/ 23 июня 2011

Я не понимаю, почему запрос находится в строке запроса, конечно, он будет работать лучше

ALTER PROCEDURE [sesuser].[Login_GetUserList]
(  
@beginsWith NVARCHAR(20) = NULL,
@SortBy nvarchar(20) = NULL,
@sortByDirection nvarchar(5) = N'ASC'
)
AS
BEGIN    
DECLARE @searchStr NVARCHAR(21)    
IF @beginsWith IS NULL
    SET @beginsWith = N''
ELSE
    SET @beginsWith = dbo.SuperTrim(@beginsWith);    
IF LEN(@beginsWith) > 0
    SET @searchStr = @beginsWith + N'%'
ELSE
    SET @searchStr = N'%'    

SELECT  [OfficeName]
    ,[SESLoginID] AS LoginID
    ,[SESSuspended] AS LoginSuspended
    ,[SESAdmin] AS Role_Admin
    ,[SESLoginID]
    ,[SESFirstName]
    ,[SESLastName]
    ,[SESEmail]
    ,[SESSuspended]
    FROM sesuser.SESLogin
    INNER JOIN sesuser.Office
    ON sesuser.Office.OfficeID = sesuser.SESLogin.SESLoginID
    WHERE SESFirstName LIKE @searchStr 

END
...