动态sql存储过程更新查询问题?

Posted

技术标签:

【中文标题】动态sql存储过程更新查询问题?【英文标题】:Dynamic sql stored procedure update query issue? 【发布时间】:2012-12-06 09:36:52 【问题描述】:

我已经编写了下面的代码来将我表中的文件路径列设置为'F:\DataMigration\Wise\DELTA_20121008\Attachments\SR\SR_1.txt'

where SR_1 is file_name column
      .txt is file_ext column from my table.

但在执行以下过程后,我将表中的文件路径列作为

'F:\DataMigration\Wise\DELTA_20121008\Attachments\file_name.file_ext'

表示它将列名视为字符串,我如何将其设为列,以便它将 使用该列中的值。

alter procedure [dbo].[WISEMissingAttachmentReportGenerator]
(
@tablename varchar(255), @pathonlocal nvarchar(255)
)
as
begin
--step 1
exec dbo.proc_alter_table @tablename
--step 2
EXEC ('update '+ @tablename +
' set filepath = '''+ @pathonlocal + ' file_name'+'.'+'file_ext''')
EXEC('Select * from '+@tablename)
end

exec [dbo].[WISEMissingAttachmentReportGenerator] [WISE.Non_VP_Service_Request_Attachments_File_Check_Analysis],
N'F:\DataMigration\Wise\DELTA_20121008\Attachments\SR\'

【问题讨论】:

【参考方案1】:

试试;

EXEC('UPDATE '+ @tablename +
' SET filepath = '''+ @pathonlocal + ''' + file_name + '''+'.'+''' + file_ext')

等于;

UPDATE [YourTable] SET filepath = 'YourPath' + file_name + '.' + file_ext

【讨论】:

谢谢,我在动态sql中使用单引号时总是很困惑,你能告诉我为什么@pathonlocal变量前有三个连续的单引号。 因为@pathonlocal 是一个string,它只有值。所以你需要用'your_string' 附上它。这对任何字符串类型变量都有效。在 3 个 ''' 引号中,' 用于结尾 'SET filepath = 'from other 2 one as **escape character** to the other. 不需要点的连接,它可以包含在一个字符串中,而不是file_name + '''+'.'+''' + file_ext中的'''+'.'+'''它可以是file_name + ''.'' + file_ext,它会给出正确的输出,它是这种方式更简单,它可以为您节省一个连接操作。 @IvanG,是的,为了清楚起见,我留下了它。【参考方案2】:

尝试将您的陈述更改为:

EXEC ('update '+ @tablename +
' set filepath = '''+ @pathonlocal + ''' + file_name + ''.'' + file_ext')

【讨论】:

@ViswanathanIyer 很高兴为您提供帮助 :) 要在文字字符串中写入单引号,您必须将它们加倍,因此当内引号在外引号前关闭时,您会得到后续的 3 个单引号。试试这个:SELECT 'What''s your name? My name is ''Joe''...',如果最后没有 ...,它看起来好像最后有 3 个后续单引号 - SELECT 'What''s your name? My name is ''Joe'''【参考方案3】:
declare @tblnm varchar(20) = 'test'
declare @upda varchar(20) = 'update '
declare @set varchar(25) = ' set'
declare @id varchar(25) = ' id'
declare @cmd varchar(1000)

set @cmd = @upda + @tblnm + @set + @id + '=7'
exec(@cmd)

SAMPLE SQL UPDATE QUERY - FOR BUILDING TABLENAME DYNAMICALLY  
EXECUTED GUYS - THIS IS CALL JUGAAAAAAAAAD [NO NEED TO GET INTO ''' STUFF]

【讨论】:

以上是关于动态sql存储过程更新查询问题?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL Server 中的存储过程动态更新

My SQL 动态查询执行并将输出输出到存储过程中的变量中

sql plpgsql存储过程中的动态查询示例

动态透视查询查看/存储过程?

sql 存储过程如何动态拼接where后面的条件

sql server存储过程如何动态生成表名