View Full Version : مشکل در syntax
ma.andishe
دوشنبه 04 فروردین 1393, 14:15 عصر
با سلام لطفا راهنمایی بفرمایید
من میخواهم به جای radifnemone یک متغییر بزارم که به ازای اون متغییر بره و فانکشم مورد نظر رو بخونه
SELECT
CT.__$start_lsn,
CT.__$operation,
CASE CT.__$operation
WHEN 1 THEN 'Delete'
WHEN 2 THEN 'Insert'
WHEN 3 THEN 'Update - Pre'
WHEN 4 THEN 'Update - Post'
END AS Operation,
CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
cdc.fn_cdc_get_net_changes_dbo_radifNemone (@from_lsn, @to_lsn, N'all update old') AS CT
INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn
END
حمیدرضاصادقیان
سه شنبه 05 فروردین 1393, 09:44 صبح
سلام.
شما باید از dynamic Query استفاده کنید و اونجا رو با اسم یک متغیر پر کنید و اونو Exec کنید.
اگر در سایت هم جستجو کنید موارد متعددی رو میتونید پیدا کنید.
ma.andishe
چهارشنبه 06 فروردین 1393, 11:08 صبح
سلام ممنون از جوابتون ولی متاسفانه جواب نمیگیرم
ALTER PROCEDURE [dbo].[showchange]
@nametable nvarchar(50)
AS
declare @str nvarchar(max)
BEGIN
SET NOCOUNT ON;
DECLARE @from_lsn binary(10), @to_lsn binary(10)
SET @from_lsn = sys.fn_cdc_get_min_lsn(@nametable)
SET @to_lsn = sys.fn_cdc_get_max_lsn()
set @str=N'SELECT
CT.__$start_lsn,
CT.__$operation,
CASE CT.__$operation
WHEN 1 THEN D
WHEN 2 THEN I
WHEN 3 THEN U - Pre
WHEN 4 THEN U - Post
END AS Operation,
CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
cdc.fn_cdc_get_all_changes_dbo_@nametable (@from_lsn, @to_lsn, '') AS CT
INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn)'
Execute Sp_executeSQl @str
END
ma.andishe
چهارشنبه 06 فروردین 1393, 16:49 عصر
من این کد زو به صورتهای متفاوتی نوشتم ولی تا حالا جواب نگرفتم تمام مشکل من در خال خاضر پارامترهای اون تابع هستش که ست نمیشن و به همین دلیل جوابی رو بر نمیگردونه
declare @nametable nvarchar(50)
declare @str nvarchar(max)
DECLARE @from_lsn binary(10), @to_lsn binary(10)
BEGIN
set @nametable='radifnemone'
SET @from_lsn = sys.fn_cdc_get_min_lsn(@nametable)
print @from_lsn
SET @to_lsn = sys.fn_cdc_get_max_lsn()
print @to_lsn
set @str=N'SELECT
CT.__$start_lsn,
CT.__$operation,
CASE CT.__$operation
WHEN 1 THEN D
WHEN 2 THEN I
WHEN 3 THEN U - Pre
WHEN 4 THEN U - Post
END AS Operation,
CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
cdc.fn_cdc_get_all_changes_dbo_'+ @nametable +'('+ CONVERT(char(10),@from_lsn) +','+ CONVERT(char(10),@to_lsn) +', '') AS CT
INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn'
print @str
print @from_lsn
print @to_lsn
END
حمیدرضاصادقیان
چهارشنبه 06 فروردین 1393, 19:23 عصر
اینو ببینید.
declare @nametable nvarchar(50)
declare @str nvarchar(max)
DECLARE @from_lsn binary(10), @to_lsn binary(10)
BEGIN
set @nametable='radifnemone'
SET @from_lsn = sys.fn_cdc_get_min_lsn(@nametable)
print @from_lsn
SET @to_lsn = sys.fn_cdc_get_max_lsn()
print @to_lsn
set @str=N'SELECT
CT.__$start_lsn,
CT.__$operation,
CASE CT.__$operation
WHEN 1 THEN D
WHEN 2 THEN I
WHEN 3 THEN U - Pre
WHEN 4 THEN U - Post
END AS Operation,
CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
cdc.fn_cdc_get_all_changes_dbo_'+ @nametable +'('+ CONVERT(char(10),@from_lsn) +','+ CONVERT(char(10),@to_lsn) +', QUOTENAME('')) AS CT
INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn'
print @str
print @from_lsn
print @to_lsn
END
البته باید مشخص کنید پارامترهای ورودی تابع رو مشخص کنید نوعشون چی هست؟؟
ma.andishe
چهارشنبه 06 فروردین 1393, 19:49 عصر
تشکر از اینکه جواب دادین
متاسفانه جواب نداد
ببینید پارامتر وروددیsp نام جدول هستش که@nametabel
پرامتر های تابع هم که از نوع باینری هستن
ممنون از اینکه وقت میزارید
ma.andishe
شنبه 09 فروردین 1393, 11:21 صبح
دوستان اگه کسی بلده خواهشا زاهنمایی کنه
من به اینصوزت هم نوشتم ولی بازم ارور سینتکس رو میده
declare @nametable nvarchar(50)='radifnemone'
declare @str nvarchar(max)
--DECLARE @from_lsn char(10), @to_lsn char(10)
BEGIN
--SET @from_lsn = CONVERT(char(10), CONVERT(int,sys.fn_cdc_get_min_lsn(@nametable)))
----print @from_lsn
--SET @to_lsn =CONVERT(char(10), CONVERT(int,sys.fn_cdc_get_max_lsn() ))
--print @to_lsn
set @str=N'SELECT
CT.__$start_lsn,
CT.__$operation,
CASE CT.__$operation
WHEN 1 THEN D ,
WHEN 2 THEN I,
WHEN 3 THEN U - Pre,
WHEN 4 THEN U - Post,
END AS Operation,
CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
cdc.fn_cdc_get_all_changes_dbo_'+ @nametable +'(sys.fn_cdc_get_min_lsn('+@nametable +')' + ', sys.fn_cdc_get_max_lsn()) AS CT
INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn'
execute sp_executesql @str
--print @str
END
ferdin
شنبه 09 فروردین 1393, 22:03 عصر
دوستان اگه کسی بلده خواهشا زاهنمایی کنه
من به اینصوزت هم نوشتم ولی بازم ارور سینتکس رو میده
declare @nametable nvarchar(50)='radifnemone'
declare @str nvarchar(max)
--DECLARE @from_lsn char(10), @to_lsn char(10)
BEGIN
--SET @from_lsn = CONVERT(char(10), CONVERT(int,sys.fn_cdc_get_min_lsn(@nametable)))
----print @from_lsn
--SET @to_lsn =CONVERT(char(10), CONVERT(int,sys.fn_cdc_get_max_lsn() ))
--print @to_lsn
set @str=N'SELECT
CT.__$start_lsn,
CT.__$operation,
CASE CT.__$operation
WHEN 1 THEN D ,
WHEN 2 THEN I,
WHEN 3 THEN U - Pre,
WHEN 4 THEN U - Post,
END AS Operation,
CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
cdc.fn_cdc_get_all_changes_dbo_'+ @nametable +'(sys.fn_cdc_get_min_lsn('+@nametable +')' + ', sys.fn_cdc_get_max_lsn()) AS CT
INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn'
execute sp_executesql @str
--print @str
END
دستور Case رو اشتباه نوشتی ، بعد از هر when نیازی به کاما (,) نیست.
SELECT
CT.__$start_lsn,
CT.__$operation,
(
CASE CT.__$operation
WHEN 1 THEN D
WHEN 2 THEN I
WHEN 3 THEN U - Pre
WHEN 4 THEN U - Post
END) AS Operation,
CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
cdc.fn_cdc_get_all_changes_dbo_radifnemone(sys.fn_ cdc_get_min_lsn(radifnemone), sys.fn_cdc_get_max_lsn()) AS CT
INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn
ma.andishe
یک شنبه 10 فروردین 1393, 11:42 صبح
من به اون شکل هم نوشتم اگه بالا رو ببینی مشکل در کانورت کردن دیتا تایپ داخل تابع هستش که گیر میده و ارور incompatible رو میده
ferdin
یک شنبه 10 فروردین 1393, 13:24 عصر
من به اون شکل هم نوشتم اگه بالا رو ببینی مشکل در کانورت کردن دیتا تایپ داخل تابع هستش که گیر میده و ارور incompatible رو میده
دوست عزیز ، میشه دقیقا error رو اینجا بزاری ، چون شما گفتی syntax error داری نه مشکل تو کانورت کردن.
ma.andishe
یک شنبه 10 فروردین 1393, 15:32 عصر
سلام ممنون که زمان میزاری
ببینید الان در حال حاضر ظاهرا ارور سینتکسش برطرف شده ولی دیتایی رو بر نمیگردونه
من ازپرنت رشته ای که درست میکنه کپی میگرم و اونو اجرا میکنم این ارور رو میده
Msg 102, Level 15, State 1, Line 30
Incorrect syntax near 'A6800'.
ضمنا خواستی تست کنی همین اسکریپت که پاین رو تست کن
declare
@nametable nvarchar(30)='radifnemone'
declare
@str nvarchar(max)
DECLARE @from_lsn varbinary(10), @to_lsn varbinary(10),@row_filter_option nvarchar(30) = N'all'
BEGIN
SET @from_lsn = sys.fn_cdc_get_min_lsn(@nametable)
--print @from_lsn
SET @to_lsn =sys.fn_cdc_get_max_lsn()
--print @to_lsn
set @str=N'SELECT
CT.__$start_lsn,
CT.__$operation,
CASE CT.__$operation
WHEN 1 THEN D
WHEN 2 THEN I
WHEN 3 THEN U - Pre
WHEN 4 THEN U - Post
END AS Operation,
CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
cdc.fn_cdc_get_all_changes_dbo_'+ @nametable +'('+CONVERT(VARCHAR(10), @from_lsn,2)+','+CONVERT(VARCHAR(10), @to_lsn,2)+','+@row_filter_option+') AS CT
INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn'
exec sp_executesql @str
print @str
END
ma.andishe
دوشنبه 11 فروردین 1393, 19:36 عصر
دوستان کسی نیست کمک کنه؟
ببینیید من مساله جور دیگه میگم
توی یک کوئری که به صورت داینامیک نوشته شده چطور میشه متغیرهایی رو در اون جا داد یعنی کانورت کرد که شکل ظاهری اون متغییر عوض نشه چون برای سنجیدن استفاده میشه
این متغیره در اصل باینری هستند و باید به صورت استرینگ در داخل کوئری داینامیک استفاده شود
ma.andishe
سه شنبه 12 فروردین 1393, 12:01 عصر
دوستان به این شکل نوشتم جواب داد
USE [kaavianmfs]
GO
/****** Object: StoredProcedure [dbo].[showchange] Script Date: 04/01/2014 10:25:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[showchange]
@nametable nvarchar(15)
AS
declare @str nvarchar(max),@row_filter_option nvarchar(30) = '''all'''
declare @from_lsn varbinary(30)=null, @to_lsn varbinary(30)=null
declare @begin_time datetime, @end_time datetime
declare @DELETE CHAR(10)='''DEL''',@INSERT CHAR(10)='''INS''',@UPDATE_PRE CHAR(10)='''U-PRE''',@UPDATE_POS CHAR(10)='''U-POS'''
SET @begin_time = GETDATE()-7;
--print @begin_time
SET @end_time = GETDATE();
--print @end_time
BEGIN
SET NOCOUNT ON;
SELECT @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
--print @from_lsn
SELECT @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than', @end_time);
--print @to_lsn
set @str =N'select sys.fn_cdc_map_lsn_to_time(__$start_lsn) AS ChangeDTS
,
CASE __$operation
WHEN 1 THEN '+ @DELETE +'
WHEN 2 THEN '+ @INSERT +'
WHEN 3 THEN '+ @UPDATE_PRE +'
WHEN 4 THEN '+ @UPDATE_POS +'
END AS Operation,*
from
cdc.fn_cdc_get_all_changes_dbo_'+ LTRIM(rtrim(@nametable))+'('+CONVERT(varchar(max), @from_lsn,1)+','+CONVERT(varchar(max), @to_lsn,1)+','+ @row_filter_option +')'
exec sp_executesql @str
--print @str
end
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.