5,913
社区成员




Update.sql.Text := MainSql;
MAStream := TStringStream.Create(MDelta, TEncoding.UTF8);
MAStream.position := 0;
Update.LoadFromStream(MAStream, sfJSON);
for i := 0 to MainCancelList.Count - 1 do
begin
Update.FieldByName(MainCancelList[i]).ProviderFlags := [];
end;
Erorrs := Update.ApplyUpdates(0);
这是我的更新语句,通过JSON把数据传过来,还有把不更新的列也传递过来,不更新的列是否有办法直接在该过程里面通过MainSql获取出来?或者有什么其他的办法处理,我现在是用存储过程提取出来的
create proc spGetCanceStr @UpdateSql nvarchar(Max),
@UpdateTable nvarchar(100)
as
begin
declare @CanceStr nvarchar(max)
set @CanceStr=''
create table #TableColumn
(
CName varchar(100)
)
insert into #TableColumn
SELECT name FROM sys.dm_exec_describe_first_result_set(@UpdateSql, NULL, 0)
select @CanceStr=@CanceStr+CName+',' from #TableColumn where CName not in(SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=@UpdateTable)
drop table #TableColumn
if isnull(@CanceStr,'')<>''
set @CanceStr=substring(@CanceStr,1,len(@CanceStr)-1)
select @CanceStr CanceStr
end
根据你的描述,想要在存储过程内通过传递的 MainSql 和 UpdateSql 获取不更新的列,可以优化现有的存储过程,通过解析传入的SQL语句以及利用SQL Server的元数据系统视图,来提取不需要更新的列。以下是改进后的存储过程以及一些解释:
改进后的存储过程
CREATE PROCEDURE spGetCanceStr
@UpdateSql NVARCHAR(MAX),
@UpdateTable NVARCHAR(100)
AS
BEGIN
DECLARE @CanceStr NVARCHAR(MAX)
SET @CanceStr = ''
-- 临时表存储 SQL 语句的结果集字段
CREATE TABLE #TableColumn (CName VARCHAR(100))
-- 获取 SQL 语句的结果集字段
INSERT INTO #TableColumn
SELECT name
FROM sys.dm_exec_describe_first_result_set(@UpdateSql, NULL, 0)
-- 获取表的所有字段
DECLARE @TableColumns TABLE (COLUMN_NAME NVARCHAR(100))
INSERT INTO @TableColumns (COLUMN_NAME)
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @UpdateTable
-- 查找不需要更新的列
SELECT @CanceStr = @CanceStr + CName + ','
FROM #TableColumn
WHERE CName NOT IN (SELECT COLUMN_NAME FROM @TableColumns)
DROP TABLE #TableColumn
-- 去掉最后的逗号
IF ISNULL(@CanceStr, '') <> ''
SET @CanceStr = SUBSTRING(@CanceStr, 1, LEN(@CanceStr) - 1)
SELECT @CanceStr AS CanceStr
END
procedure TForm1.RefreshData;
begin
// 假设你已经有了一个 TFDQuery 组件并且已经设置了其 Connection 属性
with FDQuery1 do
begin
// 设置 SQL 查询
SQL.Text := 'SELECT * FROM YourTableName';
// 打开查询(这将执行查询并填充数据集)
Open;
// ... 在此处处理数据,例如显示在 DBGrid 或其他控件中 ...
// 如果需要再次获取最新数据,可以关闭并重新打开查询
Close;
Open; // 这将重新执行查询并获取最新数据
end;
end;
你这样使用存储过程取,应该是比较好的方式了。从效率与方便性来说,都应该是首选。唯一的缺陷可能是对数据库的依赖。