【发布时间】:2013-06-07 01:12:21
【问题描述】:
假设:
我需要从“PrivateDB”数据库同步“PublicDB”。其中两个参数应传递给存储过程,服务器名称和日期时间类型参数。
HistoryDate 不是主键,而是用于更新。
场景:
如果今天是 8 日,并且用户没有从 dateTimePicker -UI 中选择任何上一个日期,则此存储过程只会在 8 日更新记录。
如果今天是 8 日并且用户在我的 SP 中选择 5th of month= targetdate,它应该从 4th 删除“PublicDB”表,然后再次插入 5th、6th 和 8th。
问题: 服务器参数工作正常,但对于数据时间参数:
如果 Sp 在 sql server 中执行得到这个错误: 从字符串转换日期和/或时间时转换失败。
如果添加到表适配器它得到这个错误: 生成的 SELECT 语句 从字符串转换日期/时间时对话失败。 *要将这些设置应用于您的查询,请单击完成*
这里是 sp:
CREATE PROCEDURE [dbo].[spname] @Server SYSNAME,
@TDate NVARCHAR(50) --have tested: DateTime
AS
BEGIN
DECLARE @SQL1 NVARCHAR(2000);
DECLARE @SQL2 NVARCHAR(2000);
DECLARE @LastRecordDate DATETIME;
DECLARE @Count INT;
DECLARE @TargetDate DATETIME;
SET @TargetDate = CONVERT(DATETIME, @TDate, 121);
SET @Count = CONVERT(INT, 'SELECT COUNT(*) FROM [' + @Server + '].[PublicDB].[dbo].[TableName]
WHERE HistoryDate >= [' + @TargetDate + '] ');
EXECUTE sp_executesql @Count;
IF @Count > 0 BEGIN
SET @SQL1 = 'DELETE FROM [' + @Server + '].[PublicDB].[dbo].[TableName]
WHERE HistoryDate >= [' + @TargetDate + ']
INSERT INTO [PublicDB].[dbo].[TableName]
SELECT TOP 5
[HistoryDate]
,[columnName1]
,[columnName2]
,[columnName3]
,[columnName4]
,[columnName5]
,[columnName6]
FROM PrivateDB.dbo.TableName
WHERE HistoryDate >= [' + @TargetDate + ']
';
EXECUTE sp_executesql @SQL1;
END
ELSE BEGIN
SET @LastRecordDate = CONVERT(DATETIME, 'SELECT TOP 1 HistoryDate FROM [PublicDB].[dbo].[TableName] ORDER BY HistoryDate DESC', 121);
-- has tested: cast('SELECT TOP 1 HistoryDate FROM [Public].[dbo].[TableName] ORDER BY HistoryDate DESC' as datetime)
EXECUTE sp_executesql @LastRecordDate;
SET @SQL2 = '
INSERT INTO [' + @Server + '].[PublicDB].[dbo].[TableName]
SELECT TOP 5
[HistoryDate]
,[columnName1]
,[columnName2]
,[columnName3]
,[columnName4]
,[columnName5]
,[columnName6]
FROM PrivateDB.dbo.TableName
WHERE HistoryDate > [' + @LastRecordDate + ']
';
EXECUTE sp_executesql @SQL2;
END
END
【问题讨论】:
标签: sql-server stored-procedures parameter-passing