簡體   English   中英

使用動態SQL查詢更新表

[英]update table with dynamic sql query

對於一個項目,我們使用的表(名為txtTable )包含所有文本。 並且每一列包含不同的語言(例如, L9列是英語, L7列是德語,等等。)

TextID L9          L7               L16    L10    L12
------------------------------------------------------
26     Archiving   Archivierung     NULL   NULL   NULL
27     Logging     Protokollierung  NULL   NULL   NULL
28     Comments    Kommentar        NULL   NULL   NULL

該表位於Microsoft SQL Server 2005上的數據庫中。最大的問題是,每次重新啟動程序時,此數據庫名稱都會更改。 這是此第三方程序的典型行為,無法更改。

在此數據庫旁邊,並且在同一服務器上是我們自己的數據庫。 在此數據庫中,有幾個表指向textID ,這些表用於以正確的語言生成用於報告的數據(SQL Server Reporting Services)。 該數據庫還包含一個表"ProjectSettings" ,該表具有一些屬性,例如文本表數據庫的名稱,以及用於生成報告數據的存儲過程。

現在,通過創建動態SQL查詢並在存儲過程中執行該查詢,來從具有變化的數據庫名稱的表中請求正確語言的正確文本。

現在我們想知道是否有更干凈的方法來獲取正確語言的文本。 我們正在考慮使用textID和語言作為參數來創建一個函數,但是我們找不到找到這種方法的好方法。 我們考慮過一個函數,因此我們只能在select語句中使用它,但這不起作用:

CREATE FUNCTION [dbo].[GetTextFromLib]
(
    @TextID  int, 
    @LanguageColumn Varchar(5)
)
RETURNS varchar(255)
AS
BEGIN
    -- return variables
    DECLARE @ResultVar varchar(255)

    -- Local variables
    DECLARE @TextLibraryDatabaseName varchar(1000)
    DECLARE @nvcSqlQuery varchar(1000)  

    -- get the report language database name
    SELECT @TextLibraryDatabaseName = TextLibraryDatabaseName FROM ProjectSettings

    SET @nvcSqlQuery = 'SELECT @ResultVar =' + @LanguageColumn + ' FROM [' + @TextLibraryDatabaseName + '].dbo.TXTTable WHERE TEXTID = ' + cast(@TextID as varchar(30))

     EXEC(@nvcSqlQuery)

    -- Return the result of the function
    RETURN @ResultVar
END

有什么辦法可以解決此問題,所以我們不必在存儲過程中使用動態sql,因此它僅包含在1個函數中?

在此先感謝您的光臨,

庫爾特

是的,可以借助SQL Server 2005引入的同義詞機制來實現 。因此,您可以在設置過程中基於ProjectSettings表中的數據創建同義詞,並可以在函數中使用它。 您的代碼將如下所示:

更新:在這里對函數的代碼進行了注釋,因為它仍然包含動態SQL,而在Kurt的注釋中說,該函數無法在函數中工作。 該代碼下面是新版本的功能。

-- Creating synonym for TXTTable table
-- somewhere in code when processing current settings
-- Suppose your synonym name is 'TextLibrary'
--
-- Drop previously created synonym
IF  EXISTS (SELECT * FROM sys.synonyms WHERE name = N'TextLibrary')
DROP SYNONYM TextLibrary

-- Creating synonym using dynamic SQL

-- Local variables
DECLARE @TextLibraryDatabaseName varchar(1000)
DECLARE @nvcSqlQuery varchar(1000)  

-- get the report language database name
SELECT @TextLibraryDatabaseName = TextLibraryDatabaseName FROM ProjectSettings

SET @nvcSqlQuery = 'CREATE SYNONYM TextLibrary FOR [' + @TextLibraryDatabaseName + '].dbo.TXTTable'

EXEC(@nvcSqlQuery)

-- Synonym created  

/* UPDATE: This code is commented but left for discussion consistency
-- Function code
CREATE FUNCTION [dbo].[GetTextFromLib]
(
    @TextID  int, 
    @LanguageColumn Varchar(5)
)
RETURNS varchar(255)
AS
BEGIN
    -- return variables
    DECLARE @ResultVar varchar(255)

    -- Local variables
    DECLARE @nvcSqlQuery varchar(1000)  

    SET @nvcSqlQuery = 'SELECT @ResultVar =' + @LanguageColumn + ' FROM TextLibrary WHERE TEXTID = ' + cast(@TextID as varchar(30))

     EXEC(@nvcSqlQuery)

    -- Return the result of the function
    RETURN @ResultVar

END
*/

更新這是解決該問題的另一種嘗試。 現在,它使用一些XML技巧:

-- Function code
CREATE FUNCTION [dbo].[GetTextFromLib]
(
    @TextID  int, 
    @LanguageColumn Varchar(5)
)
RETURNS varchar(255)
AS
BEGIN
    -- return variables
    DECLARE @ResultVar varchar(255)

    -- Local variables
    DECLARE @XmlVar XML 

    -- Select required record into XML variable
    -- XML has each table column value in element with corresponding name
    SELECT @XmlVar = ( SELECT * FROM TextLibrary
                       WHERE TEXTID = @TextID
                       FOR XML RAW, ELEMENTS )

    -- Select value of required element from XML
    SELECT @ResultVar = Element.value('(.)[1]', 'varchar(255)') 
    FROM @XmlVar.nodes('/row/*') AS T(Element)
    WHERE Element.value('local-name(.)', 'varchar(50)') = @LanguageColumn

    -- Return the result of the function
    RETURN @ResultVar

END

希望這可以幫助。

此問題歸功於Stackoverflow- 如何從T-SQL中的xml變量獲取節點名稱和值

對我來說,這聽起來像是一個總的PITA ...但是,您正在處理的“單詞”數據庫有多大。 特別是如果它變化不大並且保持不變。 為什么不按某個正常周期(例如早晨)進行操作,只需生成一個動態查詢即可查詢已更改的動態查詢,並將其同步到您數據庫中不會更改的“標准”表名。 然后,所有查詢都針對您的版本運行,並且每次都完全刪除恆定的動態查詢。 是的,將需要運行此同步存儲過程,但是如果可以按計划運行它,則應該沒問題,而且對於適當的語言上下文,“單詞”表有多大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM