gpt4 book ai didi

sql-server - 如果列存在,则 SQLServer 在 'EXEC' 内条件执行

转载 作者:行者123 更新时间:2023-12-04 05:33:37 24 4
gpt4 key购买 nike

我是 SQLServer 脚本的新手(通常是 C++ 开发人员),非常感谢您的帮助。

我正在尝试对包含“PROJID”列的 SQLServer 数据库中的所有表执行“查找和替换”更新。我真的很难找到一种不向我报告的方法:

消息 207,级别 16,状态 1,第 1 行列名“PROJID”无效。

我正在执行的语句是:

EXEC
(
'IF EXISTS(SELECT * FROM sys.columns WHERE name = N''PROJID'' AND Object_ID = Object_ID(N''' + @TableName + '''))' +
' BEGIN' +
' UPDATE ' + @TableName +
' SET ' + @ColumnName + ' = REPLACE(' + @ColumnName + ',''' + @ReplaceIDStr + ''',''' + @FindIDStr + ''')' +
' WHERE ' + @ColumnName + ' LIKE ''' + @ReplaceIDStr + '''' + ' AND PROJID = ''1000''' +
' END'
)

我也试过使用:
'IF COL_LENGTH(''' + @TableName + ''',''PROJID'') IS NOT NULL' +

而不是上面的列存在检查。这也仍然给我“无效的列名”消息。

我很乐意在“Exec”语句之外进行列存在检查,但我也不知道如何去做。

最佳答案

将此查询的结果输出为文本。不要忘记更改变量的值!获取结果并运行它。

SET NOCOUNT ON

DECLARE @ColumnName VARCHAR(200) = 'ReplaceColumn'
, @ReplaceIdStr VARCHAR(200) = 'ExampleReplaceIdStr'
, @FindIdStr VARCHAR(200) = 'ExampleFindIdStr'

PRINT 'BEGIN TRAN'
PRINT 'SET XACT_ABORT ON'

SELECT
'UPDATE ' + C.TABLE_NAME + CHAR(13)
+ 'SET ' + @ColumnName + ' = REPLACE(' + @ColumnName + ', ''' + @ReplaceIdStr + ''', ''' + @FindIdStr + ''')' + CHAR(13)
+ 'WHERE ' + @ColumnName + ' LIKE ''%' + @ReplaceIdStr + '%'' AND PROJID = ''1000''' + CHAR(13)
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE C.COLUMN_NAME = 'PROJID'

PRINT 'COMMIT TRAN'

SET NOCOUNT OFF

编辑:另外,一些推理:你说你想要更新所有包含名为 PROJID 的列的表。 .您的第一个查询只是说如果表 @TableName有一个 PROJID列,然后更新 @ColumnName就可以了。但它并不能保证上面有@ColumnName。我给出的查询也没有检查,因为我假设所有表都具有 PROJID还有 @ColumnName .如果不是这种情况,请告诉我,我可以更新答案以进行检查。您收到了 Invalid Column Name错误指向 @ColumnName不存在。

您的查询最多会更新一个表( @TableName ),而我给您的查询将更新每个包含 PROJID 的表。 .我希望这就是你的目的。

编辑 2:这是一个可以同时运行它的版本:
DECLARE @ColumnName VARCHAR(200) = 'Value'
, @ReplaceIdStr VARCHAR(200) = 'ExampleReplaceIdStr'
, @FindIdStr VARCHAR(200) = 'ExampleFindIdStr'


DECLARE @Sql NVARCHAR(MAX)
DECLARE UpdateCursor CURSOR FOR
SELECT
'UPDATE ' + C.TABLE_NAME
+ ' SET ' + @ColumnName + ' = REPLACE(' + @ColumnName + ', ''' + @ReplaceIdStr + ''', ''' + @FindIdStr + ''')'
+ ' WHERE ' + @ColumnName + ' LIKE ''%' + @ReplaceIdStr + '%'' AND PROJID = ''1000'''
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE C.COLUMN_NAME = 'PROJID'

OPEN UpdateCursor

FETCH NEXT FROM UpdateCursor
INTO @Sql

WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_executesql @Sql

FETCH NEXT FROM UpdateCursor
INTO @Sql
END


CLOSE UpdateCursor
DEALLOCATE UpdateCursor

关于sql-server - 如果列存在,则 SQLServer 在 'EXEC' 内条件执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12268082/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com