繁体   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