我正在從我的web應用程序中執行SQLBulkCopy並將記錄插入臨時表中。這是我第一次處理登臺表。將接受數據的實時表格有大約200個字段,可以轉換到未來。當發生這種變化時,我不想重新編寫合併語句。沒有指定列名的SQL合併功能
我想出了這個模仿合併功能的SQL,但並不要求我拼出表列。我不是一位SQL專家,並且希望某個人能夠查看並讓我知道是否看到使用此SQL可能會出現的任何問題,因爲我沒有看到有關此搜索和許多人搜索的任何示例。
請注意,臨時表中具有空id域的記錄將被插入。
-- set the table names, primary key field & vars to hold query parts
DECLARE @LiveTable varchar(20) = 'Test'
DECLARE @StagingTable varchar(20) = 'TestStaging'
DECLARE @PKField varchar(20) = 'TestPK'
DECLARE @SQLSet nvarchar(MAX) = ''
DECLARE @SQLInsertFields nvarchar(MAX) = ''
-- get comma delimited field names
DECLARE @Fields nvarchar(MAX) = (SELECT dbo.fn_GetCommaDelimitedFieldNames(@LiveTable))
-- loop through fields generating set clause of query to execute
WHILE LEN(@Fields) > 0
BEGIN
DECLARE @Field varchar(50) = left(@Fields, CHARINDEX(',', @Fields+',')-1)
IF @Field <> @PKField -- the primary key field cannot be updated
BEGIN
SET @SQLSet += ', ' + @LiveTable + '.' + @Field + ' = ' + @StagingTable + '.' + @Field
SET @SQLInsertFields += ', ' + @Field
END
SET @Fields = STUFF(@Fields, 1, CHARINDEX(',', @Fields+','), '')
END
-- remove the leading comma
SET @SQLSet = SUBSTRING(@SQLSet,3,LEN(@SQLSet))
SET @SQLInsertFields = SUBSTRING(@SQLInsertFields,3,LEN(@SQLInsertFields))
-- update records from staging table where primary key is provided
DECLARE @SQL nvarchar(MAX) = N'UPDATE ' + @LiveTable +
' SET ' + @SQLSet +
' FROM ' + @LiveTable +
' INNER JOIN ' + @StagingTable +
' ON ' + @LiveTable + '.' + @PKField + ' = ' + @StagingTable + '.' + @PKField
-- insert records from staging table where primary key is null
SET @SQL += '; INSERT INTO ' + @LiveTable + ' (' + @SQLInsertFields + ') SELECT ' + @SQLInsertFields + ' FROM ' + @StagingTable + ' WHERE ' + @PKField + ' IS NULL'
-- delete the records from the staging table
SET @SQL += '; DELETE FROM ' + @StagingTable
-- execute the sql statement to update existing records and insert new records
exec sp_executesql @SQL;
如果任何人看到任何與表演或其他任何問題,我欣賞洞察力。
您可能希望將其作爲事務執行,以便在插入或更新時不會出現錯誤,然後刪除臨時表。 – Hogan 2013-03-13 02:43:22
@霍根 - 好點,肯定會投入交易。感謝您的輸入。 – Ricketts 2013-03-13 02:48:54
200個字段在一個表中?是關係型還是平面文件? – 2013-03-13 02:49:30