C# SQL Server或C中列中的行组
我正在使用SQL Server 2014和.NET 4.5,用C语言编程 我正在导入一个Excel表格,其中包含一些动态列和相应的数据,并保存到数据库中。到目前为止,我是成功的,但一些数据显示在网格中我遇到了一个问题 导入数据屏幕: 我尝试了一些事情,但没有成功 数据保存到数据库中。直到totalPh是下一个记录开始后的一个记录: 预期结果C# SQL Server或C中列中的行组,c#,sql-server,C#,Sql Server,我正在使用SQL Server 2014和.NET 4.5,用C语言编程 我正在导入一个Excel表格,其中包含一些动态列和相应的数据,并保存到数据库中。到目前为止,我是成功的,但一些数据显示在网格中我遇到了一个问题 导入数据屏幕: 我尝试了一些事情,但没有成功 数据保存到数据库中。直到totalPh是下一个记录开始后的一个记录: 预期结果 此网站提供了一些帮助Hmm您可以尝试以下内容: SQL端的解决方案 --drop cached TempCacheTable if exists and c
此网站提供了一些帮助Hmm您可以尝试以下内容: SQL端的解决方案
--drop cached TempCacheTable if exists and create new
IF OBJECT_ID('tempdb..#TempCacheTable') IS NOT NULL DROP TABLE #TempCacheTable;
CREATE TABLE [#TempCacheTable] ( [Index] [int] IDENTITY(1,1) NOT NULL )
DECLARE @fName nvarchar(30), @val nvarchar(30);
DECLARE @columns nvarchar(max) = '', @col nvarchar(max) = '', @sql varchar(max) = '', @valStr nvarchar(max) = '';
DECLARE @first bit = 1, @counter int = 0;
--create cursor to loop through @TempTable
DECLARE Column_Cur CURSOR
FOR SELECT FieldName, FieldValue FROM AttImportDetail WHERE AttImportID = 1;
OPEN Column_Cur;
FETCH NEXT FROM Column_Cur INTO @fName, @val;
WHILE @@FETCH_STATUS = 0
BEGIN
--set the dynamic column
IF @first = 1 BEGIN
SET @col = '[' + @fName + '] nvarchar(20)';
SET @columns = '[' + @fName + ']';
SET @valStr = @val;
SET @first = 0;
END ELSE BEGIN
SET @col = @col + ', [' + @fName + '] nvarchar(20)';
SET @columns = @columns + ', ' + '[' + @fName + ']';
SET @valStr = @valStr + ', ' + @val;
END
-- or you can filter by column name
IF @fName = 'TotalP' BEGIN
-- SET @col = @col + ', [' + @fName + '] int';
END
-- break cursor after all 12 columns
IF @counter = 12 BEGIN
BREAK;
END
SET @counter = @counter + 1;
FETCH NEXT FROM Column_Cur INTO @fName, @val;
END
CLOSE Column_Cur;
DEALLOCATE Column_Cur;
SELECT @sql = 'ALTER TABLE #TempCacheTable ADD ' + @col
--execute to apply the change to #TempCacheTable
EXEC(@sql);
SET @sql = 'INSERT INTO #TempCacheTable (' + @columns + ') VALUES (' + @valStr + ');
SELECT * FROM #TempCacheTable;';
EXEC(@sql);
--drop cached TempCacheTable if exists and create new
IF OBJECT_ID('tempdb..#TempCacheTable') IS NOT NULL DROP TABLE #TempCacheTable;
如果希望列行在TotalPH之后停止。然后在到达TotalPH列后停止此光标。
应用这些列,并创建第二个游标,用它收集值数据,并在每行结束于TotalPH之后将其插入TempCacheTable。然后它会按照你想要的那样列出它
以下是新更新的工作代码示例:
DECLARE @temp TABLE (
AttImportID int,
FieldName nvarchar(20),
FieldValue nvarchar(20)
)
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, 'EmbCode', 'FA160620');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '1', 'PH');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '2', 'K');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '3', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '4', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '5', 'WO');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '6', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '7', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '8', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '9', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '10', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, 'TotalP', '18');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, 'TotalPH', '0,5');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, 'EmbCode', 'FA160621');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '1', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '2', 'H');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '3', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '4', 'WO');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '5', 'WO');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '6', 'K');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '7', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '8', 'PH');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '9', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '10', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, 'TotalP', '21');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, 'TotalPH', '26');
--drop cached TempCacheTable if exists and create new
IF OBJECT_ID('tempdb..#TempCacheTable') IS NOT NULL DROP TABLE #TempCacheTable;
CREATE TABLE [#TempCacheTable] ( [Index] [int] IDENTITY(1,1) NOT NULL )
DECLARE @fName nvarchar(30), @val nvarchar(30);
DECLARE @columns nvarchar(max) = '', @col nvarchar(max) = '', @sql varchar(max) = '', @valStr nvarchar(max) = '';
DECLARE @first bit = 1, @counter int = 0;
--create cursor to loop through @TempTable
DECLARE Column_Cur CURSOR
FOR SELECT FieldName, FieldValue FROM @temp WHERE AttImportID = 1;
OPEN Column_Cur;
FETCH NEXT FROM Column_Cur INTO @fName, @val;
WHILE @@FETCH_STATUS = 0
BEGIN
--set the dynamic column
IF @first = 1 BEGIN
SET @col = '[' + @fName + '] nvarchar(20)';
SET @columns = '[' + @fName + ']';
SET @valStr = '''' + @val + '''';
SET @first = 0;
END ELSE BEGIN
SET @col = @col + ', [' + @fName + '] nvarchar(20)';
SET @columns = @columns + ', ' + '[' + @fName + ']';
SET @valStr = @valStr + ', ''' + @val + '''';
END
-- break cursor after all 12 columns
IF @counter = 12 BEGIN
BREAK;
END
SET @counter = @counter + 1;
FETCH NEXT FROM Column_Cur INTO @fName, @val;
END
CLOSE Column_Cur;
DEALLOCATE Column_Cur;
SELECT @sql = 'ALTER TABLE #TempCacheTable ADD ' + @col
--execute to apply the change to #TempCacheTable
EXEC(@sql);
SET @sql = 'INSERT INTO #TempCacheTable (' + @columns + ') VALUES (' + @valStr + ');
SELECT * FROM #TempCacheTable;';
EXEC(@sql);
--drop cached TempCacheTable if exists and create new
IF OBJECT_ID('tempdb..#TempCacheTable') IS NOT NULL DROP TABLE #TempCacheTable;
因此,您只需创建第二个游标,在其中根据第一个游标为每一行进行插入,它将为您提供所需的内容。我是通过C代码完成的
// select FieldName,FieldValue from AttImportDetail where AttImportID =1
private DataTable GenerateTransposedTable(DataTable inputTable)
{
DataTable outputTable = new DataTable();
DataTable distinct = inputTable.DefaultView.ToTable(true, "FieldName"); // get unique column name
int Columns = distinct.Rows.Count; // get unique column count
int rows = inputTable.Rows.Count / distinct.Rows.Count; // count no of rows
// create datatable with unique column name
foreach (DataRow inRow in distinct.Rows)
{
string newColName = inRow[0].ToString();
outputTable.Columns.Add(newColName);
}
for (int i = 0; i < rows; i++)
{
DataRow newRow = outputTable.NewRow();
for (int c = 0; c < outputTable.Columns.Count; c++)
{
int rowsCount = i*outputTable.Columns.Count + c;
string colValue = inputTable.Rows[rowsCount]["FieldValue"].ToString();
string FieldName = inputTable.Rows[rowsCount]["FieldName"].ToString();
newRow[FieldName] = colValue;
}
outputTable.Rows.Add(newRow);
}
return outputTable;
}
你真的只有两条select语句吗?还是你想把他们联系起来?看看sql,你得到了你想要的。从上面显示的数据,例如Attimportid=1,你有两行FieldName=2,一行是FieldValue K,另一行是H,你如何识别哪个属于哪个empcode?你自己尝试过什么?这不是一个代码编写服务。我在这里遇到问题,每32行在一行上,如何引入每个组行的列这里有一些帮助我得到错误消息2705,级别16,状态3,每个表中的第1行列名必须是唯一的。表“TempCacheTable”中的列名“TotalP”被指定了多次。我们不能硬编码totalPh,此字段可以是任何内容,但我们可以从AttImportDetail中使用select distinct GroupRows=FieldName,其中AttImportID=1。由于列名重复出现,因此会出现此错误。只需在光标指向该列后停止。如果不能按列名停止,但coulmn的数量始终保持不变,则可以使用计数器作为停止。数到所有列,然后停止。并应用列。然后创建另一个游标,收集变量中每一行的数据,并将其插入每个圆之后。插入所有数据后,您只需从TempCacheTable中选择所有数据。我在cursor中工作了一周,我已经编写了上面相同的代码,您能检查一下吗。只是我在为i=0分配数据时遇到了问题。。。。。。。。循环中
// select FieldName,FieldValue from AttImportDetail where AttImportID =1
private DataTable GenerateTransposedTable(DataTable inputTable)
{
DataTable outputTable = new DataTable();
DataTable distinct = inputTable.DefaultView.ToTable(true, "FieldName"); // get unique column name
int Columns = distinct.Rows.Count; // get unique column count
int rows = inputTable.Rows.Count / distinct.Rows.Count; // count no of rows
// create datatable with unique column name
foreach (DataRow inRow in distinct.Rows)
{
string newColName = inRow[0].ToString();
outputTable.Columns.Add(newColName);
}
for (int i = 0; i < rows; i++)
{
DataRow newRow = outputTable.NewRow();
for (int c = 0; c < outputTable.Columns.Count; c++)
{
int rowsCount = i*outputTable.Columns.Count + c;
string colValue = inputTable.Rows[rowsCount]["FieldValue"].ToString();
string FieldName = inputTable.Rows[rowsCount]["FieldName"].ToString();
newRow[FieldName] = colValue;
}
outputTable.Rows.Add(newRow);
}
return outputTable;
}