Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
没有尝试你的代码,所以我不确定它是否工作。我的解决方案是使用光标,而使用更少的代码。你觉得怎么样?很公平-如果它有效,它就有效!避免使用动态SQL也是很好的。游标的缺点是,对于大型数据集来说,性能不太好。如果您只使用一个小的数据集,而且性能很好,那就太棒了_Sql_Excel_Ssms_Sql Server 2014 Express - Fatal编程技术网

没有尝试你的代码,所以我不确定它是否工作。我的解决方案是使用光标,而使用更少的代码。你觉得怎么样?很公平-如果它有效,它就有效!避免使用动态SQL也是很好的。游标的缺点是,对于大型数据集来说,性能不太好。如果您只使用一个小的数据集,而且性能很好,那就太棒了

没有尝试你的代码,所以我不确定它是否工作。我的解决方案是使用光标,而使用更少的代码。你觉得怎么样?很公平-如果它有效,它就有效!避免使用动态SQL也是很好的。游标的缺点是,对于大型数据集来说,性能不太好。如果您只使用一个小的数据集,而且性能很好,那就太棒了,sql,excel,ssms,sql-server-2014-express,Sql,Excel,Ssms,Sql Server 2014 Express,没有尝试你的代码,所以我不确定它是否工作。我的解决方案是使用光标,而使用更少的代码。你觉得怎么样?很公平-如果它有效,它就有效!避免使用动态SQL也是很好的。游标的缺点是,对于大型数据集来说,性能不太好。如果您只使用一个小的数据集,而且性能很好,那就太棒了!是的,你的表演是对的。但是CSV表只有约3000行,它在约3秒钟内重命名了我的列,这在我看来是很好的。无论如何谢谢你! +---------+---------+------+ | Col1 | Col2 | Col3 | +--


没有尝试你的代码,所以我不确定它是否工作。我的解决方案是使用光标,而使用更少的代码。你觉得怎么样?很公平-如果它有效,它就有效!避免使用动态SQL也是很好的。游标的缺点是,对于大型数据集来说,性能不太好。如果您只使用一个小的数据集,而且性能很好,那就太棒了!是的,你的表演是对的。但是CSV表只有约3000行,它在约3秒钟内重命名了我的列,这在我看来是很好的。无论如何谢谢你!
+---------+---------+------+
|  Col1   |  Col2   | Col3 |
+---------+---------+------+
| Value 1 | Value 2 |  123 |
| Value 2 | Value 2 |  456 |
| Value 3 | Value 3 |  789 |
+---------+---------+------+
+----+---------+-----------+-----------+
| ID | ColName |  Language |  Addition |
+----+---------+-----------+-----------+
|  1 | Col1    |  D        |       123 |
|  2 | Col2    |  D        |       456 |
|  3 | Col3    |  D        |       789 |
|  4 | Col1    |  E        |       123 |
|  5 | Col2    |  E        |       456 |
|  6 | Col3    |  E        |       789 |
+----+---------+-----------+-----------+
Col1 + Addition
Col2 + Addition
Col3 + Addition

+-------------+-------------+---------+
|  Col1 123   |  Col2 456   | Col3789 |
+-------------+-------------+---------+
| Value 1     | Value 2     |  123    |
| Value 2     | Value 2     |  456    |
| Value 3     | Value 3     |  789    |
+-------------+-------------+---------+
/*
The script between the first two dividing lines of dashes is just used to set up the example. The bit you want is from
the "-- Test Variables --" line.
*/
-----------------------------------------------------------------------------------------------------------------------
IF OBJECT_ID('tempdb..#Original') IS NOT NULL DROP TABLE #Original
IF OBJECT_ID('tempdb..#ExcelInfo') IS NOT NULL DROP TABLE #ExcelInfo

CREATE TABLE #Original
( Col1  VARCHAR(50)
 ,Col2  VARCHAR(50)
 ,Col3  VARCHAR(50))
CREATE TABLE #ExcelInfo
( Id            INT IDENTITY(1,1)   NOT NULL
 ,ColName       VARCHAR(50)         NOT NULL
 ,[Language]    CHAR(1)             NOT NULL
 ,Addition      INT                 NOT NULL)

INSERT #Original
SELECT *
FROM
        (   SELECT 'Value 1' AS Col1,'Value 2' AS Col2  ,123 AS Col3
    UNION   SELECT 'Value 2'        ,'Value 2'          ,456
    UNION   SELECT 'Value 3'        ,'Value 3'          ,789)           AS This
ORDER BY Col1


INSERT #ExcelInfo (ColName,[Language],Addition)
SELECT *
FROM
        (   SELECT 'Col1' AS ColName, 'D' AS [Language], 123 AS Addition
    UNION   SELECT 'Col2','D',456
    UNION   SELECT 'Col3','D',789
    UNION   SELECT 'Col1','E',123
    UNION   SELECT 'Col2','E',456
    UNION   SELECT 'Col3','E',789)                                  AS This
ORDER BY [Language], Addition

-----------------------------------------------------------------------------------------------------------------------
-- Test Variables --
DECLARE @SetLang CHAR(1) = 'D'
-----------------------------------------------------------------------------------------------------------------------
-- make the default empty, not null on our dynamic string, so it can be added to
DECLARE @Columns VARCHAR(MAX) = ''
DECLARE @SQL VARCHAR(MAX)

CREATE TABLE #OriginalColumns
( Id INT IDENTITY(1,1)
 ,Name VARCHAR(50))
CREATE TABLE #BasicResult
(Id INT NOT NULL, Name VARCHAR(50), Value VARCHAR(50))
-- If you can add an id column to your original table, this bit is unecessary - you can use yours in place of this table
CREATE TABLE #Original_WITH_Id
( Id INT IDENTITY(1,1)
 ,Col1  VARCHAR(50)
 ,Col2  VARCHAR(50)
 ,Col3  VARCHAR(50))

INSERT #Original_WITH_Id
SELECT * FROM #Original
-----------------------------------------------------------------------------------------------------------------------
-- List out the columns and put the list in a variable.
INSERT #OriginalColumns
SELECT QUOTENAME(Col.name)
FROM tempdb.sys.columns AS Col
WHERE Col.object_id = OBJECT_ID('tempdb.dbo.#Original_WITH_Id')
-- we're not interested in the identity column at the moment
AND Col.name <> 'Id'
-- keep everything in the same order as they are listed on the table
ORDER BY Col.column_id

SELECT @Columns = @Columns + ',' + Name
FROM #OriginalColumns
-- clip off the leading comma
SELECT @Columns = SUBSTRING(@Columns,2,LEN(@Columns))

-- get a full list of everything, creating our new list of columns as we go, using the Id column to keep a mark on which
-- row each record originally came from
SET @SQL =
'INSERT #BasicResult
SELECT Id, New.Name, Value FROM
     (SELECT Id, Name, Value
      FROM #Original_WITH_Id
      UNPIVOT (Value FOR Name IN (' + @Columns + ')) Unpvt) AS Old
JOIN (SELECT ColName, CONVERT(VARCHAR(50),ColName) + '' '' + CONVERT(VARCHAR(50),Addition)  AS Name
      FROM #ExcelInfo
      WHERE [Language] = ''' + @SetLang + ''') AS New ON Old.Name = New.ColName'
PRINT @SQL
EXEC (@SQL)

-- now update our list of columns to be the new column headings
SET @Columns = ''
SELECT @Columns = @Columns + ',' + QUOTENAME(Name) FROM (SELECT DISTINCT Name FROM #BasicResult) AS Names
SELECT @Columns = SUBSTRING(@Columns,2,LEN(@Columns))

-- pivout our results back out to their original format, but with the new column headings (include the Id if you want)
SET @SQL =
'SELECT /*Id,*/ ' + @Columns + '
 FROM
    (SELECT Id, Name,Value
     FROM #BasicResult) AS Up
     PIVOT (MAX(Value) FOR Name IN  (' + @Columns + ')) AS Pvt'

PRINT @SQL
EXEC (@SQL)

-- clean up --
DROP TABLE #OriginalColumns
DROP TABLE #BasicResult
IF NOT EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'CSVTest')
BEGIN
CREATE TABLE _DICTIONARY
( _TableName VARCHAR (20),
_ColumnName  VARCHAR  (20),
_Language    VARCHAR  (20),
_FieldShort  VARCHAR (50),
_FieldMid    VARCHAR (50),
_FieldLong   VARCHAR (50)
)
BULK
INSERT _DICTIONARY
FROM 'C:\_DICTIONARY.csv'
WITH
(
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n'
)
END
DECLARE @dic_tableName            as nvarchar(50),
        @dic_columnName           as nvarchar(50),
        @db_tableName              as nvarchar(50),
        @db_columnName            as nvarchar(50);


DECLARE C CURSOR FAST_FORWARD FOR
    SELECT _TableName, _ColumnName FROM _DICTIONARY
OPEN C;

FETCH NEXT FROM C INTO @dic_tableName, @dic_columnName;

WHILE @@FETCH_STATUS = 0
BEGIN
  IF EXISTS(SELECT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @dic_tableName AND COLUMN_NAME = @dic_columnName)
BEGIN
  SET @db_tableName = @dic_tableName + '.' + @dic_columnName
  SET @db_columnName = @dic_tableName + '_' + @dic_columnName
  EXEC sp_rename @db_tableName, @db_columnName ,'COLUMN'
  FETCH NEXT FROM C INTO @dic_tableName, @dic_columnName;
END
  ELSE
BEGIN
  FETCH NEXT FROM C INTO @dic_tableName, @dic_columnName;
END
END

CLOSE C;
DEALLOCATE C;