sql-server - Microsoft SQL Server:在大厅数据库中查找和更新确切值,即使它是 PRIMARY
问题描述
我想更改未知表或列的特定值。我找到了帮助我搜索的代码。我发现在某些表中,它是主列。
我必须做这份工作,因为我有很多价值观需要改变。
我试图做代码,但我得到了很多错误:
列名“TableNameA”无效。
列名“ColumnNameA”无效。
希望得到帮助,因为我还是 SQL 新手。
我应该怎么办?
DECLARE @SearchStrTableName nvarchar(255), @SearchStrColumnName nvarchar(255), @SearchStrColumnValue nvarchar(255), @SearchStrInXML bit, @FullRowResult bit, @FullRowResultRows int
SET @SearchStrColumnValue = '4523'
Declare @NewValueInt int = 4195403
Declare @NewValueVarChar nvarchar(20) = '4194523'
/* use LIKE syntax */
SET @FullRowResult = 1
SET @FullRowResultRows = 3
SET @SearchStrTableName = NULL /* NULL for all tables, uses LIKE syntax */
SET @SearchStrColumnName = NULL /* NULL for all columns, uses LIKE syntax */
SET @SearchStrInXML = 0 /* Searching XML data may be slow */
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
CREATE TABLE #Results (TableName nvarchar(128), ColumnName nvarchar(128), ColumnValue nvarchar(max),ColumnType nvarchar(20))
SET NOCOUNT ON
DECLARE @TableName nvarchar(256) = '',@ColumnName nvarchar(128),@ColumnType nvarchar(20), @QuotedSearchStrColumnValue nvarchar(110), @QuotedSearchStrColumnName nvarchar(110)
SET @QuotedSearchStrColumnValue = QUOTENAME(@SearchStrColumnValue,'''')
DECLARE @ColumnNameTable TABLE (COLUMN_NAME nvarchar(128),DATA_TYPE nvarchar(20))
WHILE @TableName IS NOT NULL
BEGIN
SET @TableName =
(
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME LIKE COALESCE(@SearchStrTableName,TABLE_NAME)
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0
)
IF @TableName IS NOT NULL
BEGIN
DECLARE @sql VARCHAR(MAX)
SET @sql = 'SELECT QUOTENAME(COLUMN_NAME),DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(''' + @TableName + ''', 2)
AND TABLE_NAME = PARSENAME(''' + @TableName + ''', 1)
AND DATA_TYPE IN (' + CASE WHEN ISNUMERIC(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@SearchStrColumnValue,'%',''),'_',''),'[',''),']',''),'-','')) = 1 THEN '''tinyint'',''int'',''smallint'',''bigint'',''numeric'',''decimal'',''smallmoney'',''money'',' ELSE '' END + '''char'',''varchar'',''nchar'',''nvarchar'',''timestamp'',''uniqueidentifier''' + CASE @SearchStrInXML WHEN 1 THEN ',''xml''' ELSE '' END + ')
AND COLUMN_NAME LIKE COALESCE(' + CASE WHEN @SearchStrColumnName IS NULL THEN 'NULL' ELSE '''' + @SearchStrColumnName + '''' END + ',COLUMN_NAME)'
INSERT INTO @ColumnNameTable
EXEC (@sql)
WHILE EXISTS (SELECT TOP 1 COLUMN_NAME FROM @ColumnNameTable)
BEGIN
PRINT @ColumnName
SELECT TOP 1 @ColumnName = COLUMN_NAME,@ColumnType = DATA_TYPE FROM @ColumnNameTable
SET @sql = 'SELECT ''' + @TableName + ''',''' + @ColumnName + ''',' + CASE @ColumnType WHEN 'xml' THEN 'LEFT(CAST(' + @ColumnName + ' AS nvarchar(MAX)), 4096),'''
WHEN 'timestamp' THEN 'master.dbo.fn_varbintohexstr('+ @ColumnName + '),'''
ELSE 'LEFT(' + @ColumnName + ', 4096),''' END + @ColumnType + '''
FROM ' + @TableName + ' (NOLOCK) ' +
' WHERE ' + CASE @ColumnType WHEN 'xml' THEN 'CAST(' + @ColumnName + ' AS nvarchar(MAX))'
WHEN 'timestamp' THEN 'master.dbo.fn_varbintohexstr('+ @ColumnName + ')'
ELSE @ColumnName END + ' LIKE ' + @QuotedSearchStrColumnValue
INSERT INTO #Results
EXEC(@sql)
IF @@ROWCOUNT > 0 IF @FullRowResult = 1
BEGIN
SET @sql = 'SELECT TOP ' + CAST(@FullRowResultRows AS VARCHAR(3)) + ' ''' + @TableName + ''' AS [TableFound],''' + @ColumnName + ''' AS [ColumnFound],''FullRow>'' AS [FullRow>],*' +
' FROM ' + @TableName + ' (NOLOCK) ' +
' WHERE ' + CASE @ColumnType WHEN 'xml' THEN 'CAST(' + @ColumnName + ' AS nvarchar(MAX))'
WHEN 'timestamp' THEN 'master.dbo.fn_varbintohexstr('+ @ColumnName + ')'
ELSE @ColumnName END + ' LIKE ' + @QuotedSearchStrColumnValue
EXEC(@sql)
DECLARE @sqlU VARCHAR(MAX)
Declare @sqlN VARCHAR(MAX)
SET @sqlU = N'UPDATE ' + quotename(@SearchStrTableName) + ' SET ' +quotename(@SearchStrColumnName)+ ' = ''' +@NewValueVarChar+ ''' WHERE ' +quotename(@SearchStrColumnName)+ ' = ''' + @SearchStrColumnValue + '''';
EXEC (@sqlU)
SET @sqlN = N'Update ' + quotename(@SearchStrTableName) + ' SET '+ quotename(@SearchStrColumnName) +'=''' +@NewValueVarChar+ '''where'+ quotename(@SearchStrColumnName) + '='+ @SearchStrColumnValue
EXEC (@sqlN)
END
DELETE FROM @ColumnNameTable WHERE COLUMN_NAME = @ColumnName
END
END
END
SET NOCOUNT OFF
IF OBJECT_ID('tempdb..#Abd_tmptbl') IS NOT NULL DROP TABLE #Abd_tmptbl
CREATE TABLE #Abd_tmptbl (TableNameA nvarchar(128), ColumnNameA nvarchar(128), ColumnValueA nvarchar(max),ColumnTypeA nvarchar(20), Count int)
INSERT INTO #Abd_tmptbl
SELECT TableName, ColumnName, ColumnValue, ColumnType, COUNT(*) AS Count FROM #Results
GROUP BY TableName, ColumnName, ColumnValue, ColumnType
DECLARE @Tableee VARCHAR(20), @Columnee varchar(20), @Constraint varchar(20)
DECLARE @items TABLE(tabl int, clmn int)
Create Table #PK_tbl (PK_Col varchar (10))
WHILE EXISTS (select TOP 1 TableNameA FROM #Abd_tmptbl)
BEGIN
SELECT TOP 1 @Tableee = TableNameA, @Columnee = ColumnNameA
------------ GET All PKs of the Table ---------------------
DECLARE @PK_sql varchar(max) = N'INSERT INTO #PK_tbl(PK_Col)
(SELECT Col.Column_Name from INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col
WHERE Col.Constraint_Name = Tab.Constraint_Name AND Col.Table_Name = Tab.Table_Name AND Constraint_Type = "PRIMARY KEY" AND Col.Table_Name = ' + @Tableee +')'
EXEC (@PK_sql)
------------------------------------------------------------
------------ GET CONTRAINT Name ----------------------------
SET @Constraint = N'SELECT name FROM sys.key_constraints WHERE type = "PK" AND OBJECT_NAME(parent_object_id) = ' + @Columnee
------------------------------------------------------------
------------ RELEASE Table From CONSTRAINTS ----------------
DECLARE @REL_tbl VARCHAR(max) = N'ALTER TABLE' + @Tableee +'DROP CONSTRAINT'+ @Constraint
EXEC (@REL_tbl)
------------------------------------------------------------
DECLARE @Update_tbl VARCHAR(max) = N'UPDATE '+ @Tableee + 'SET ' + @Columnee + '=' + @NewValueInt+ ' WHERE' + @Columnee + '=' + @SearchStrColumnValue
EXEC (@Update_tbl)
DECLARE @Sealing_tbl VARCHAR(max) = N'ALTER TABLE' + @Tableee + 'ADD CONSTRAINT' + @Constraint + 'PRIMARY KEY CLUSTERED (SELECT * FROM #PK_tbl)'
EXEC (@Update_tbl)
END
解决方案
推荐阅读
- excel - Excel将按钮变成图像
- json - 如果先前的命令在 gitlab 脚本中发现无效文件,如何失败?
- python - 当我运行它的 .py 文件时,无法在 python 中写入文件。但是当我在pycharm中运行它时,它确实有效
- javascript - 限制列表中每个数字最多 5 位数字
- django-rest-framework - 身份验证成功后,如何返回从自定义用户子类化的 Django 用户?
- google-bigquery - 基于 BigQuery 中其他字段整数的 DateSub 函数
- python - 为什么减去日期时间会产生溢出错误?
- azure - 将 Azure Functions 与事件中心链集成的最佳参数是什么
- python - Python:在迭代标准输出时从子进程中捕获异常
- iis - 在发布托管在 IIS 中的 blazor 程序集应用程序 ASP.NET CORE 后,我收到了 DirectoryNotFoundException 错误