我有14张不同类型员工的表。我有一个连接到我的SQL Server数据库的C#应用程序,当我在文本框中键入姓氏时,它会带回一个带有该姓氏的记录并将其显示在列表框中。
但是我只用一张桌子设法做到了这一点。因此,如果我输入“琼斯”,它将从一张桌子中带回并显示琼斯。
我想从所有14张桌子中带回所有琼斯。换句话说,当我输入姓氏时,我需要应用程序向我显示所有14个表中姓氏的所有记录。
对此有什么合理的解决方法?如果我有一张包含所有员工的桌子,但我需要分离,这会容易得多。基本上,当我单击搜索按钮时,我需要从具有给定名称的14个表中的任何一个中获取应用程序。
对此有什么合适的方法?
答案 0 :(得分:0)
您应该重复Code 14 Times以从所有这些表中收集值,或者您在一个Statement中一次为所有14个表提交SQL查询或14个查询 - 具体取决于您的数据访问技术......
答案 1 :(得分:0)
好的,要从所有14个表中获取结果,您可以使用UNION ALL
运算符,因此您的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')
每次选择都需要有相同数量的字段。但是,如果将所有名称(和任何其他共享数据)保存在一个表中,并使用具有不同数据集的所有14个表连接Key,则更好的方法。这样你可以防止像上面这样的长查询(可能是慢查询)和查询看起来更像这样:
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=...
答案 2 :(得分: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();
}
答案 3 :(得分: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