1

我有 14 张不同类型的员工表。我有一个连接到我的 SQL Server 数据库的 C# 应用程序,当我在文本框中输入姓氏时,它会带回具有该姓氏的记录并将其显示在列表框中。

但是,我只用一张桌子就做到了。因此,如果我键入“Jones”,它会从一张表中返回并显示 Jones。

我想从所有 14 张桌子中带回所有的琼斯。换句话说,当我输入姓氏时,我需要应用程序向我显示所有 14 个表中该姓氏的所有记录。

对此有什么合理的方法?如果我有一张所有员工的桌子会容易得多,但我需要分开。基本上,当我单击搜索按钮时,我需要应用程序从具有给定名称的 14 个表中的任何一个中获取。

什么是合适的方法?

4

4 回答 4

0

在数据库中定义以下存储过程:

CREATE PROCEDURE GetAll_SP
(
    @FirstName VARCHAR(50)
)  
AS
    BEGIN
        (SELECT 1, first_name, last_name FROM UsersTable1 WHERE first_name = @FirstName)
        UNION
        (SELECT 2, first_name, last_name FROM UsersTable2 WHERE first_name = @FirstName)
        UNION
        (SELECT 3, first_name, last_name FROM UsersTable3 WHERE first_name = @FirstName)
        -- ....
    END

GO

或以下一个代替您不需要对您的用户位置进行任何控制:

CREATE PROCEDURE GetAll_SP
(
    @FirstName VARCHAR(50)
)  
AS
    BEGIN
        (SELECT first_name, last_name FROM UsersTable1 WHERE first_name = @FirstName)
        UNION ALL
        (SELECT first_name, last_name FROM UsersTable2 WHERE first_name = @FirstName)
        UNION ALL
        (SELECT first_name, last_name FROM UsersTable3 WHERE first_name = @FirstName)
        -- ....
    END

GO

然后,在您的代码中:

String firstName = "Jones";

using (SqlCommand cmd = new SqlCommand("GetAll_SP", m_Connection))
{
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = firstName;

    m_Connection.Open();
    cmd.ExecuteNonQuery();
}
于 2017-12-16T23:26:18.370 回答
0

只需设置@SearchStr,每个表中的每一列都会被搜索。

drop table #results
go

declare @SearchStr nvarchar(100)
set @SearchStr = 'Donna%' -- use wildcards

CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))

SET NOCOUNT ON

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET  @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

WHILE @TableName IS NOT NULL
BEGIN
    SET @ColumnName = ''
    SET @TableName = 
    (
        SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
        FROM    INFORMATION_SCHEMA.TABLES
        WHERE       TABLE_TYPE = 'BASE TABLE'
            AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
            AND OBJECTPROPERTY(
                    OBJECT_ID(
                        QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                         ), 'IsMSShipped'
                           ) = 0
    )

    WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
    BEGIN
        SET @ColumnName =
        (
            SELECT MIN(QUOTENAME(COLUMN_NAME))
            FROM    INFORMATION_SCHEMA.COLUMNS
            WHERE       TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                AND TABLE_NAME  = PARSENAME(@TableName, 1)
                AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'text')
                AND QUOTENAME(COLUMN_NAME) > @ColumnName
        )

    print cast(@TableName as nvarchar(200)) + ' ' + @ColumnName

    IF @ColumnName IS NOT NULL
        BEGIN
            INSERT INTO #Results
            EXEC
            (
                --'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
                --FROM ' + @TableName + ' (NOLOCK) ' +
                --' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2

                'SELECT ''' + @TableName + '.' + @ColumnName + ''', ' + @ColumnName + ' 
                FROM ' + @TableName + ' (NOLOCK) ' +
                ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
            )
        END
    END 
END

SELECT ColumnName, ColumnValue FROM #Results
于 2017-12-22T01:02:16.443 回答
0

您应该重复您的代码 14 次以从所有这些表中收集值,或者您一次使用联合或在一个语句中提交 14 个查询的所有 14 个表的 SQL 查询 - 取决于您的数据访问技术......

于 2017-12-16T22:55:51.400 回答
0

好的,要从所有 14 个表中获取结果,您可以使用UNION ALLOperator,因此您的 SQL 将类似于:

(SELECT first_name, last_name FROM table1 WHERE first_name='John')
 UNION ALL
(SELECT first_name, last_name FROM table2 WHERE first_name='John')
...
(SELECT first_name, last_name FROM table14 WHERE first_name='John')

您需要在每个选择中拥有相同数量的字段。但是,如果您将所有名称(和任何其他共享数据)保存在一个表中,并使用 Key 与所有具有不同数据集的所有 14 个表连接,则更好的方法是。这样,您可以防止像上面这样的长查询(并且可能是慢查询),并且查询看起来更像这样:

SELECT first_name, last_name, user_type, user_id  WHERE first_name='John'

然后您可以从相应表中检索字段,因为字段user_type为您提供信息,在 14 个表中搜索其他数据,而 user_id 为您提供该用户的数据,因此第二个查询看起来像这样:

SELECT job_position, worksheet, other_data FROM tableN WHERE user_id=...
于 2017-12-16T23:02:47.990 回答